This article will use a GitHub open source component technology to read and write Siemens PLC data, using the Ethernet-based TCP/IP implementation, no additional components, read operations as long as the background thread will not be stuck thread, this component supports super convenient high-performance read and write operation
GitHub Address: Https://github.com/dathlin/HslCommunication If you like star or fork, you can also enjoy support.
中文版 version:https://github.com/dathlin/hslcommunication/blob/master/docs/siemens.md
You can download the installation in NuGet Manager in Visual Studio, or you can enter the following instructions directly in the NuGet console
Install-package hslcommunication
If you need a tutorial: NuGet installation Tutorial: http://www.cnblogs.com/dathlin/p/7705014.html
Technical Support QQ Group: 592132877 (the component version update details will be released in the group first) Last modified: April 5, 2018 19:00:08
Inside all kinds of small partners, for you to answer data interaction, programming skills, if you have any questions about the API provided by this interface, you can add group consultation, if there are better suggestions, welcome to put forward.
Complete information about the components and other API descriptions refer to: The Http://www.cnblogs.com/dathlin/p/7703805.html component's authorization protocol, the update log, all within the page.
This article will show you how to configure the network parameters and how to use the code to access the PLC data, hoping to give the people in need to solve some practical problems. Mainly for Siemens PLC M,Q,I,DB block data read and write, pro-test effective.
Here the use of the direct way of the network cable, if the PLC is connected to the LAN, you can read and write remotely ^_^
There are 2 namespaces used here:
Using hslcommunication;using HslCommunication.Profinet.Omron;
Just talk.
When a host computer needs to read 100 Siemens PLC equipment (here is just for example, usually use Modbus TCP is the same), you use the server initiative to request the mechanism of 100 devices is a great test of performance, If you open 100 threads to poll 100 devices, then the performance loss will be very large, not to mention the addition of equipment, if the installation of Modbus TCP server, can be a perfect solution to the performance problem, because the connection pressure will be evenly distributed to each plc, Server side as long as a new timestamp to know that the client has no connection.
We add the Modbus TCP method to 100 plc, send the data to the server's IP and port, the server distinguishes the device according to station number. This makes it possible to build a high-performance terminus. This component supports the fast setting up of a high performance Modbus TCP terminus.
Http://www.cnblogs.com/dathlin/p/7782315.html
about two modes
All of the client classes provided by this component, including Mitsubishi, Siemens, Omron, Modbus-tcp, and Simplifynet, are inherited from the dual-mode base class, and the dual-mode includes a short connection and a long connection, and the following details the differences between the next two modes
Short Connection : Each read and write is a separate request, the request is closed, if the server's port only supports single connection, then the port can be reused after shutdown, but in frequent network requests, prone to abnormal, there will be other requests unsuccessful, Especially in the case of multithreading.
Long Connection : Create a common connection channel, all the read and write requests to use this channel to complete, so that the read and write performance faster, instant multi-threaded calls will not affect the internal synchronization mechanism. If the server's port only supports a single connection, then this port is occupied, such as the port mechanism of Mitsubishi, Siemens Modbus TCP port mechanism is also the case. The following code uses long connections by default, with higher performance and multi-threaded synchronization.
In the short-connected mode, each request is a separate access, so there is no reconnection, in the long-connected mode, if this request fails, the next time the request, it will automatically reconnect to the server until the request is successful. In addition, as far as possible, all reading and writing are judged on the success of the results.
About Logging
Whether it is Mitsubishi's data access class, or Siemens, or Modbus TCP Access class, there is a lognet property used to record the log, the property is an interface class, Ilognet, everything inherits the interface can be used to record the log, the log will be in the failure of access, This is especially true because the network causes logging when Access fails (if you have a real logger configured for this lognet property): If you want to use this logging feature, please follow the blog below to instantiate it:
Http://www.cnblogs.com/dathlin/p/7691693.html
As an example:
Omronfinsnet.lognet = new HslCommunication.LogNet.LogNetSingle ("Omron.log.txt");
a description of the communication
Using the FINS-TCP protocol for data interaction, if a write failure is found during the test, it may be because
Accessing test projects
In the above GitHub source code, there is a test project, Hslcommunicationdemo, which contains a variety of client-side demo project, do not need to write any code to test the data access.
For:
Demo Project
The following three shows how to access the data of the PLC, we usually need to process after the access, the following example project shows the background from the PLC reading data, the foreground display and push to all the online client functions, clients and graphical display, with a certain reference, the project address is:
Https://github.com/dathlin/RemoteMonitor
The following picture example of the left side of the program is the server program, it should be directly connected with the PLC and access to the local area network, and then push the data to the client display. Note: A sophisticated program should separate the processing logic programs and interface programs, such as the server program here to achieve data collection, push, storage. Let the client program to implement data collation, analysis, display, so that even if the client program because of a bug, the server can still work properly.
Demo Project using Siemens access, can be easily converted to Omron project
Address support
Support addresses and examples are as follows:
- DM District D100
- CIO Area C100
- WR Zone W100
- HR Area H100
- AR Zone A100
Special thanks
- Thanks for the wine strike . Testing of this component
- Thank you for a water test of this component
Instantiation of
Private Omronfinsnet omronfinsnet = new Omronfinsnet ("192.168.0.100", 6000);
Before connecting to the server need to set three parameters, PLC unit number, PLC network node, PC network node, as follows is an example, you need to fill in according to the actual situation.
OMRONFINSNET.SA1 = 0x20; PC network number, the last number of IP addresses of the PC omronfinsnet.da1 = 0x10;//PLC network number, the last number of IP addresses of the plc OMRONFINSNET.DA2 = 0x00;//plc Unit number, is typically 0
connection server, can also be placed in the window's Load method, it is generally recommended to use a long connection, faster, but also thread-safe (call the following method is to use a long connection, if you do not directly read data, it is a short connection):
Try { Operateresult connect = Omronfinsnet.connectserver (); if (connect. issuccess) { MessageBox.Show ("Connection succeeded! " ); } else { MessageBox.Show ("Connection failed! " ); } } catch (Exception ex) { MessageBox.Show (ex. Message); }
Disconnect, that is, close the long connection, if the request data, it becomes a short connection
Omronfinsnet.connectclose ();
The following is a demonstration of some simple data operations, eliminating the success of the validation of the results, all read and write results are operateresult type and derived type, there is a issuccess attribute to determine the success or not
Read operation, where the D100 can replace the c100,a100,w100,h100 effect when the same bool d100_7 = Omronfinsnet.readbool ("D100.7"). Content; Read if the D100.7 is off, note that D100.0 is equivalent to D100 short short_d100 = omronfinsnet.readint16 ("D100"). Content; Read the D100 composed of the word ushort ushort_d100 = omronfinsnet.readuint16 ("D100"). Content; Reads a D100 composed of unsigned values int int_d100 = Omronfinsnet.readint32 ("D100"). Content; Read d100-d101 composed of signed data uint UINT_D100 = Omronfinsnet.readuint32 ("D100"). Content; Read d100-d101 composed of unsigned values float float_d100 = omronfinsnet.readfloat ("D100"). Content; Read d100-d101 composed of single-precision values long long_d100 = Omronfinsnet.readint64 ("D100"). Content; Read d100-d103 a large data value of ulong ulong_d100 = Omronfinsnet.readuint64 ("D100"). Content; Read d100-d103 composed of unsigned big data double double_d100 = omronfinsnet.readdouble ("D100"). Content; Read d100-d103 composed of double values string str_d100 = Omronfinsnet.readstring ("D100", 5). Content;Read d100-d104 composed of ASCII string data//write operation, here D100 can replace the c100,a100,w100,h100 effect when the same omronfinsnet.write ("D100" , (byte) 0x33); Write single byte Omronfinsnet.write ("D100", (short) 12345); Write double-byte signed Omronfinsnet.write ("D100", (ushort) 45678); Write double-byte unsigned omronfinsnet.write ("D100", (UINT) 3456789123); Write double-word unsigned omronfinsnet.write ("D100", 123.456f); Write single precision Omronfinsnet.write ("D100", 1234556434534545L); Write large integers with signed omronfinsnet.write ("D100", 523434234234343UL); Write large integer unsigned omronfinsnet.write ("D100", 123.456d); Write double precision Omronfinsnet.write ("D100", "K123456789");//write ASCII string
The following is a description of complex data operations, as well as bulk data operations, such as reading d100-d105
operateresult<byte[]> read = Omronfinsnet.read ("D100", 5); { if (read. issuccess) { //Here you need to customize to handle complex data based on the actual situation short D100 = omronFinsNet.ByteTransform.TransInt16 (read. Content, 0); Short D101 = omronFinsNet.ByteTransform.TransInt16 (read. Content, 2); Short D102 = omronFinsNet.ByteTransform.TransInt16 (read. Content, 4); Short D103 = omronFinsNet.ByteTransform.TransInt16 (read. Content, 6); Short D104 = omronFinsNet.ByteTransform.TransInt16 (read. Content, 7); } else { //An exception occurred } }
Writes are the same, and can be manipulated in the opposite way.
If you want to implement a custom data type, you need to inherit an interface
public class usertype:hslcommunication.idatatransfer{#region Idatatransfer private HslCommunication.Core.IByteTra Nsform bytetransform = new HslCommunication.Core.ReverseBytesTransform (); Public ushort Readcount = 20; public void ParseSource (byte[] Content) {int count = bytetransform.transint32 (content, 0); float temp = Bytetransform.transsingle (Content, 4); Short name1 = Bytetransform.transint16 (Content, 8); String barcode = Encoding.ASCII.GetString (Content, 10, 10); } public byte[] Tosource () {byte[] buffer = new BYTE[20]; Bytetransform.transbyte (count). CopyTo (buffer, 0); Bytetransform.transbyte (temp). CopyTo (buffer, 4); Bytetransform.transbyte (name1). CopyTo (buffer, 8); Encoding.ASCII.GetBytes (barcode). CopyTo (buffer, 10); return buffer; #endregion #region Public Data public int count {get; set;} Public float Temp {get; set;} Public sHort name1 {get; set;} public string Barcode {get; set;} #endregion}
So that we can read and write special data.
operateresult<usertype> read = omronfinsnet.readcustomer<usertype> ("M100"), if (read. issuccess) { usertype value = read. Content;} Write Valueomronfinsnet.writecustomer ("M100", New Usertype ());
The reading of the ultimate data:
Here provides a core message reading mechanism, you can pass your own message, and then receive the server's message, and then their own resolution operation, can be implemented according to the message format arbitrary operation, of course, the premise is the need for message support. Suppose I want to implement read D0,D1, then the final message is
46494e530000001a000000020000000080000200210000c000000101820000000002
private void Userbutton23_click_1 (object sender, EventArgs e) { byte[] buffer = HslCommunication.BasicFramework.SoftBasic.HexStringToBytes ( " 46494e530000001a000000020000000080000200210000c000000101820000000002"); Operateresult<byte[]> operate = omronfinsnet.readfromservercore (buffer); if (operate. issuccess) { //display the message returned by the server textboxappendstringline ( HslCommunication.BasicFramework.SoftBasic.ByteToHexString (operate. Content)); } else { //Display network error MessageBox.Show (operate. Tomessageshowstring ()); } }
For more detailed information, you can refer to the test items in the source code.
Not easy to create, thanks for playing rewards
C # Read-write Omron (Omron) PLC, C # Read and write data using the FINS-TCP protocol