Code Beispiele PLCcom für Modbus
Die Einbindung des PLCcom-Treibers für Modbus ist sehr einfach und benutzerfreundlich.
Die nachfolgenden Beispiele veranschaulichen die wichtigsten Funktionalitäten.
Weiterführende umfangreiche Dokumentationen mit direkt ausführbaren Code-Beispielen finden Sie in der Beispielanwendung in unserem Downloadpaket oder unter dem Button Dokumentation auf der Download-Seite.

using PLCcomModbus.Core; using PLCcomModbus.DataAdapter; using PLCcomModbus.Master; class MasterExample { #region CreateAndInitDevice //Declare the Modbus master Device private ModbusMaster Device = null; public MasterExample() { CreateAndInitDevice(); } private void CreateAndInitDevice() { Device = new ModbusMaster(); Device.SetUser("my user name from licence document"); Device.SetSerial("my serial from licence document"); try { //create new interface instance (if not applicable please uncomment) // "TCP" interface: Device.SetConnector_TCP("192.168.1.21", 502); //or (if not applicable please uncomment) // "UDP" interface: //Device.SetConnector_UDP("192.168.1.100",502); //or (if not applicable please uncomment) // "RTU" interface: //Device.SetConnector_RTU("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //or (if not applicable please uncomment) // "ASCII interface": //Device.SetConnector_ASCII("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.Connector.SetMaxIdleTime(5000); //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.RegisterMode = eRegisterMode._16Bit; //register OnConnectionStateChange event Device.Connector.OnConnectionStateChange += new ModbusConnector.ConnectionStateChangeEventHandler(Device_OnConnectionStateChange); } catch (Exception ex) { Console.WriteLine(ex.Message); return; } } private void Device_OnConnectionStateChange(object sender, eConnectionState e) { //do anything Console.WriteLine("Change PortState ==> " + e.ToString()); } #endregion }
Imports PLCcomModbus.Core Imports PLCcomModbus.DataAdapter Imports PLCcomModbus.Master Class MasterExample #Region "CreateAndInitDevice" 'Declare the Modbus master Device Private Device As ModbusMaster = Nothing Public Sub New() CreateAndInitDevice() End Sub Private Sub CreateAndInitDevice() Device = New ModbusMaster() Device.SetUser("my user name from licence document"); Device.SetSerial("my serial from licence document"); Try 'create new interface instance (if not applicable please uncomment) ' "TCP" interface: Device.SetConnector_TCP("192.168.1.21", 502) 'or (if not applicable please uncomment) ' "UDP" interface: 'Device.SetConnector_UDP("192.168.1.100",502) 'or (if not applicable please uncomment) ' "RTU" interface: 'Device.SetConnector_RTU("COM1", _ ' eBaudrate.b9600, _ ' eDataBits.DataBits8, _ ' System.IO.Ports.Parity.None, _ ' System.IO.Ports.StopBits.One, _ ' System.IO.Ports.Handshake.None) 'or (if not applicable please uncomment) ' "ASCII interface": 'Device.SetConnector_ASCII("COM1", _ ' eBaudrate.b9600, _ ' eDataBits.DataBits8, _ ' System.IO.Ports.Parity.None, _ ' System.IO.Ports.StopBits.One, _ ' System.IO.Ports.Handshake.None) 'set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.Connector.SetMaxIdleTime(5000) 'Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.RegisterMode = eRegisterMode._16Bit 'register OnConnectionStateChange event AddHandler Device.Connector.OnConnectionStateChange, AddressOf Device_OnConnectionStateChange Catch ex As Exception Console.WriteLine(ex.Message) Return End Try End Sub Private Sub Device_OnConnectionStateChange(sender As Object, e As eConnectionState) 'do anything Console.WriteLine("Change PortState ==> " & e.ToString()) End Sub #End Region End Class
import java.text.DateFormat; import java.util.Calendar; import PLCComMB.*; import PLCComMB.Enums.*; public class MasterExample implements iConnectionStateChangeEvent { // //Declare the Modbus master Device private ModbusMaster Device = null; private PortStateEventHandler portStateEventHandler = new PortStateEventHandler( this); public MasterExample() { CreateAndInitDevice(); } private void CreateAndInitDevice() { Device = new ModbusMaster(); Device.setUser("my user name from licence document"); Device.setSerial("my serial from licence document"); try { //create new interface instance (if not applicable please uncomment) // "TCP" interface: Device.setConnector_TCP("192.168.1.100", 502); //or (if not applicable please uncomment) // "UDP" interface: //Device.SetConnector_UDP("192.168.1.100",502); //or (if not applicable please uncomment) // "RTU" interface: //Device.SetConnector_RTU("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //or (if not applicable please uncomment) // "ASCII interface": //Device.SetConnector_ASCII("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.getConnector().setMaxIdleTime(5000); //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.setRegisterMode(eRegisterMode._16Bit); //register OnConnectionStateChange event Device.getConnector().addConnectionStateEventHandler( portStateEventHandler); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } } @Override public void On_ConnectionStateChange(eConnectionState e) { //do anything System.out.println("Change PortState ==> " + e.toString()); } }
Beispiel:
Einfaches Erstellen einer Modbus-Master- Instanz.
Nach dem Erstellen wird ein Connector an den Modbus-Master gebunden, in diesem Beispiel ein TCP-Connector.
using PLCcomModbus.Core; using PLCcomModbus.DataAdapter; using PLCcomModbus.Master; class MasterExample { #region CreateAndInitDevice //Declare the Modbus master Device private ModbusMaster Device = null; public MasterExample() { CreateAndInitDevice(); } private void CreateAndInitDevice() { Device = new ModbusMaster(); Device.SetUser("my user name from licence document"); Device.SetSerial("my serial from licence document"); try { //create new interface instance (if not applicable please uncomment) // "TCP" interface: Device.SetConnector_TCP("192.168.1.21", 502); //or (if not applicable please uncomment) // "UDP" interface: //Device.SetConnector_UDP("192.168.1.100",502); //or (if not applicable please uncomment) // "RTU" interface: //Device.SetConnector_RTU("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //or (if not applicable please uncomment) // "ASCII interface": //Device.SetConnector_ASCII("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.Connector.SetMaxIdleTime(5000); //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.RegisterMode = eRegisterMode._16Bit; //register OnConnectionStateChange event Device.Connector.OnConnectionStateChange += new ModbusConnector.ConnectionStateChangeEventHandler(Device_OnConnectionStateChange); //read data readModbus(); } catch (Exception ex) { Console.WriteLine(ex.Message); return; } } private void Device_OnConnectionStateChange(object sender, eConnectionState e) { //do anything Console.WriteLine("Change PortState ==> " + e.ToString()); } #endregion #region read private void readModbus() { Console.WriteLine("start reading modbus"); //declare a ReadRequest object //and set the request parameters >> read 10 holding register from adress 100 ReadRequest myReadRequest = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID eReadFunction.F03_Read_Holding_Registers,//modbus function 100,//Read start adress eDataType.SHORT,//Target Datatype 10); //quantity of objects to be read //set eventual byte order, standard = eByteOrder.AB_CD; myReadRequest.ByteOrder = eByteOrder.AB_CD; Console.WriteLine(myReadRequest.ToString()); //read from device ReadResult res = Device.Read(myReadRequest); //evaluate results Console.WriteLine(DateTime.Now.ToString() + ": " + res.Message); if (res.Quality == OperationResult.eQuality.GOOD) { StringBuilder sb = new StringBuilder(); foreach (ReadValue item in res.FetchValues()) { sb.Append("Address " + item.Address.ToString() + " / Pos" + item.AddressPosition.ToString()); sb.Append(" >> "); sb.Append(item.ToString()); sb.Append(Environment.NewLine); } Console.WriteLine(sb.ToString()); } Console.WriteLine("end reading modbus"); Console.WriteLine(Environment.NewLine); } #endregion }
Imports PLCcomModbus.Core Imports PLCcomModbus.DataAdapter Imports PLCcomModbus.Master Class MasterExample #Region "CreateAndInitDevice" 'Declare the Modbus master Device Private Device As ModbusMaster = Nothing Public Sub New() CreateAndInitDevice() End Sub Private Sub CreateAndInitDevice() Device = New ModbusMaster() Device.SetUser("my user name from licence document"); Device.SetSerial("my serial from licence document"); Try 'create new interface instance (if not applicable please uncomment) ' "TCP" interface: Device.SetConnector_TCP("192.168.1.21", 502) 'or (if not applicable please uncomment) ' "UDP" interface: 'Device.SetConnector_UDP("192.168.1.100",502) 'or (if not applicable please uncomment) ' "RTU" interface: 'Device.SetConnector_RTU("COM1", _ ' eBaudrate.b9600, _ ' eDataBits.DataBits8, _ ' System.IO.Ports.Parity.None, _ ' System.IO.Ports.StopBits.One, _ ' System.IO.Ports.Handshake.None) 'or (if not applicable please uncomment) ' "ASCII interface": 'Device.SetConnector_ASCII("COM1", _ ' eBaudrate.b9600, _ ' eDataBits.DataBits8, _ ' System.IO.Ports.Parity.None, _ ' System.IO.Ports.StopBits.One, _ ' System.IO.Ports.Handshake.None) 'set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.Connector.SetMaxIdleTime(5000) 'Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.RegisterMode = eRegisterMode._16Bit 'register OnConnectionStateChange event AddHandler Device.Connector.OnConnectionStateChange, AddressOf Device_OnConnectionStateChange 'read data readModbus() Catch ex As Exception Console.WriteLine(ex.Message) Return End Try End Sub Private Sub Device_OnConnectionStateChange(sender As Object, e As eConnectionState) 'do anything Console.WriteLine("Change PortState ==> " & e.ToString()) End Sub #End Region #Region "read" Private Sub readModbus() Console.WriteLine("start reading modbus") 'declare a ReadRequest object 'and set the request parameters >> read 10 holding register from adress 100 'Slave ID 'modbus function 'Read start adress 'Target Datatype 'quantity of objects to be read Dim myReadRequest As ReadRequest = RequestBuilder.ReadRequestBuilder.Create(1, _ eReadFunction.F03_Read_Holding_Registers, _ 100, _ eDataType.[SHORT], _ 10) 'set eventual byte order, standard = eByteOrder.AB_CD; myReadRequest.ByteOrder = eByteOrder.AB_CD Console.WriteLine(myReadRequest.ToString()) 'read from device Dim res As ReadResult = Device.Read(myReadRequest) 'evaluate results Console.WriteLine((DateTime.Now.ToString() & ": ") + res.Message) If res.Quality = OperationResult.eQuality.GOOD Then Dim sb As New StringBuilder() For Each item As ReadValue In res.FetchValues() sb.Append("Address " & item.Address.ToString() & " / Pos" & item.AddressPosition.ToString()) sb.Append(" >> ") sb.Append(item.ToString()) sb.Append(Environment.NewLine) Next Console.WriteLine(sb.ToString()) End If Console.WriteLine("end reading modbus") Console.WriteLine(Environment.NewLine) End Sub #End Region End Class
import java.text.DateFormat; import java.util.Calendar; import PLCComMB.*; import PLCComMB.Enums.*; public class MasterExample implements iConnectionStateChangeEvent { // //Declare the Modbus master Device private ModbusMaster Device = null; private PortStateEventHandler portStateEventHandler = new PortStateEventHandler( this); public MasterExample() { CreateAndInitDevice(); AccessToModbus(); } private void CreateAndInitDevice() { Device = new ModbusMaster(); Device.setUser("my user name from licence document"); Device.setSerial("my serial from licence document"); try { //create new interface instance (if not applicable please uncomment) // "TCP" interface: Device.setConnector_TCP("192.168.1.100", 502); //or (if not applicable please uncomment) // "UDP" interface: //Device.SetConnector_UDP("192.168.1.100",502); //or (if not applicable please uncomment) // "RTU" interface: //Device.SetConnector_RTU("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //or (if not applicable please uncomment) // "ASCII interface": //Device.SetConnector_ASCII("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.getConnector().setMaxIdleTime(5000); //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.setRegisterMode(eRegisterMode._16Bit); //register OnConnectionStateChange event Device.getConnector().addConnectionStateEventHandler( portStateEventHandler); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } } @Override public void On_ConnectionStateChange(eConnectionState e) { //do anything System.out.println("Change PortState ==> " + e.toString()); } private void AccessToModbus() { try { //read data (FC1-4) readModbus(); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } } private void readModbus() { System.out.println("start reading modbus"); //declare a ReadRequest object //and set the request parameters >> read 10 holding register from adress 100 ReadRequest myReadRequest = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID eReadFunction.F03_Read_Holding_Registers,//modbus function 100,//Read start adress eDataType.SHORT,//Target Datatype 10); //quantity of objects to be read //set eventual byte order, standard = eByteOrder.AB_CD; myReadRequest.setByteOrder(eByteOrder.AB_CD); System.out.println(myReadRequest.toString()); //read from device ReadResult res = Device.read(myReadRequest); //evaluate results System.out.println(DateFormat.getDateTimeInstance().format( Calendar.getInstance().getTime()) + ": " + res.getMessage()); if (res.getQuality().equals(OperationResult.eQuality.GOOD)) { StringBuilder sb = new StringBuilder(); for (ReadValue item : res.fetchValues()) { sb.append("Address " + String.valueOf(item.getAddress()) + " / Pos" + String.valueOf(item.getAddressPosition())); sb.append(" >> "); sb.append(item.toString()); sb.append(System.getProperty("line.separator")); } System.out.println(sb.toString()); } System.out.println("end reading modbus"); System.out.println(System.getProperty("line.separator")); } }
Beispiel:
Einfaches Erstellen einer Modbus-Master- Instanz.
Nach dem Erstellen wird ein Connector an den Modbus-Master gebunden, in diesem Beispiel ein TCP-Connector.
Nachfolgend werden die Rohdaten dem Puffer entnommen.
Weitere Beispiele zum Lesen von bestimmten Datentypen entnehmen Sie bitte der Dokumentation oder der Beispielanwendung aus dem Downloadpaket!
using PLCcomModbus.Core; using PLCcomModbus.DataAdapter; using PLCcomModbus.Master; class MasterExample { #region CreateAndInitDevice //Declare the Modbus master Device private ModbusMaster Device = null; public MasterExample() { CreateAndInitDevice(); } private void CreateAndInitDevice() { Device = new ModbusMaster(); Device.SetUser("my user name from licence document"); Device.SetSerial("my serial from licence document"); try { //create new interface instance (if not applicable please uncomment) // "TCP" interface: Device.SetConnector_TCP("192.168.1.21", 502); //or (if not applicable please uncomment) // "UDP" interface: //Device.SetConnector_UDP("192.168.1.100",502); //or (if not applicable please uncomment) // "RTU" interface: //Device.SetConnector_RTU("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //or (if not applicable please uncomment) // "ASCII interface": //Device.SetConnector_ASCII("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.Connector.SetMaxIdleTime(5000); //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.RegisterMode = eRegisterMode._16Bit; //register OnConnectionStateChange event Device.Connector.OnConnectionStateChange += new ModbusConnector.ConnectionStateChangeEventHandler(Device_OnConnectionStateChange); //reading Collection from Modbus readCollection(); } catch (Exception ex) { Console.WriteLine(ex.Message); return; } } private void Device_OnConnectionStateChange(object sender, eConnectionState e) { //do anything Console.WriteLine("Change PortState ==> " + e.ToString()); } #endregion #region Read Collection private void readCollection() { Console.WriteLine("start read request collection from modbus"); //declare a ReadRequest object ReadRequestCollection RequestCollection = new ReadRequestCollection(); #region Edit Collection //set request parameter //declare a ReadRequest object //and set the request parameters >> reading 6 holding register at adress 10 ReadRequest RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID eReadFunction.F03_Read_Holding_Registers,//modbus function 10, //Read start adress eDataType.BOOLEAN, //Target Datatype 6, //quantity of objects to be read 0); //Address of first Bit by reading register //add Request to Collection RequestCollection.AddReadRequest("Item1", RequestItem); Console.WriteLine("add ReadRequest "+ RequestItem.ToString()); //reading 8 holding register at adress 0 RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID eReadFunction.F03_Read_Holding_Registers,//modbus function 0, //Read start adress eDataType.BYTE, //Target Datatype 8); //quantity of objects to be read //add Request to Collection RequestCollection.AddReadRequest("Item2", RequestItem); Console.WriteLine("add ReadRequest " + RequestItem.ToString()); //reading 2 holding register at adress 12 RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID eReadFunction.F03_Read_Holding_Registers,//modbus function 12, //Read start adress eDataType.USHORT, //Target Datatype 2); //quantity of objects to be read //add Request to Collection RequestCollection.AddReadRequest("Item3", RequestItem); Console.WriteLine("add ReadRequest " + RequestItem.ToString()); //reading 2 holding register at adress 20 RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID eReadFunction.F01_Read_Coils,//modbus function 2, //Read start adress eDataType.BOOLEAN, //Target Datatype 20, //quantity of objects to be read 0); //Address of first Bit by reading register //add Request to Collection RequestCollection.AddReadRequest("Item4", RequestItem); Console.WriteLine("add ReadRequest " + RequestItem.ToString()); //reading 8 coils at adress 8 RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID eReadFunction.F01_Read_Coils,//modbus function 8, //Read start adress eDataType.BOOLEAN, //Target Datatype 8, //quantity of objects to be read 0); //Address of first Bit by reading register //add Request to Collection RequestCollection.AddReadRequest("Item5", RequestItem); Console.WriteLine("add ReadRequest " + RequestItem.ToString()); #endregion //enable optimize mode RequestCollection.Optmize = true; Console.WriteLine(RequestCollection.ToString()); //read from device ReadResultCollection ResultCollection = Device.Read(RequestCollection); //evaluate results Console.WriteLine(DateTime.Now.ToString() + ": " + ResultCollection.Message); //find itemresult with foreach-loop StringBuilder sb = new StringBuilder(); foreach (ReadResult res in ResultCollection.GetReadItemResult()) { sb.Append("Start Item:"); sb.Append(res.RequestKey); sb.Append(" "); sb.Append("Quality:"); sb.Append(" "); sb.Append(res.Quality.ToString()); sb.Append(Environment.NewLine); if (res.Quality == OperationResult.eQuality.GOOD) { Array Values = res.FetchValues(); for (int i = 0; i < Values.Length; i++) { sb.Append(Values.GetValue(i).ToString()); sb.Append(Environment.NewLine); } sb.Append("End Item:"); sb.Append(res.RequestKey); } } Console.WriteLine(sb.ToString()); Console.WriteLine("end read request collection from modbus"); Console.WriteLine(Environment.NewLine); } #endregion }
Imports PLCcomModbus.Core Imports PLCcomModbus.DataAdapter Imports PLCcomModbus.Master Class MasterExample #Region "CreateAndInitDevice" 'Declare the Modbus master Device Private Device As ModbusMaster = Nothing Public Sub New() CreateAndInitDevice() End Sub Private Sub CreateAndInitDevice() Device = New ModbusMaster() Device.SetUser("my user name from licence document"); Device.SetSerial("my serial from licence document"); Try 'create new interface instance (if not applicable please uncomment) ' "TCP" interface: Device.SetConnector_TCP("192.168.1.21", 502) 'or (if not applicable please uncomment) ' "UDP" interface: 'Device.SetConnector_UDP("192.168.1.100",502) 'or (if not applicable please uncomment) ' "RTU" interface: 'Device.SetConnector_RTU("COM1", _ ' eBaudrate.b9600, _ ' eDataBits.DataBits8, _ ' System.IO.Ports.Parity.None, _ ' System.IO.Ports.StopBits.One, _ ' System.IO.Ports.Handshake.None) 'or (if not applicable please uncomment) ' "ASCII interface": 'Device.SetConnector_ASCII("COM1", _ ' eBaudrate.b9600, _ ' eDataBits.DataBits8, _ ' System.IO.Ports.Parity.None, _ ' System.IO.Ports.StopBits.One, _ ' System.IO.Ports.Handshake.None) 'set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.Connector.SetMaxIdleTime(5000) 'Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.RegisterMode = eRegisterMode._16Bit 'register OnConnectionStateChange event AddHandler Device.Connector.OnConnectionStateChange, AddressOf Device_OnConnectionStateChange 'reading Collection from Modbus readCollection() Catch ex As Exception Console.WriteLine(ex.Message) Return End Try End Sub Private Sub Device_OnConnectionStateChange(sender As Object, e As eConnectionState) 'do anything Console.WriteLine("Change PortState ==> " & e.ToString()) End Sub #End Region #Region "Read Collection" Private Sub readCollection() Console.WriteLine("start read request collection from modbus") 'declare a ReadRequest object Dim RequestCollection As New ReadRequestCollection() '#Region "Edit Collection" 'set request parameter 'declare a ReadRequest object 'and set the request parameters >> reading 6 holding register at adress 10 'Slave ID 'modbus function 'Read start adress 'Target Datatype 'quantity of objects to be read 'Address of first Bit by reading register Dim RequestItem As ReadRequest = RequestBuilder.ReadRequestBuilder.Create(1, _ eReadFunction.F03_Read_Holding_Registers, _ 10, _ eDataType.[BOOLEAN], _ 6, _ 0) 'add Request to Collection RequestCollection.AddReadRequest("Item1", RequestItem) Console.WriteLine("add ReadRequest " & RequestItem.ToString()) 'reading 8 holding register at adress 0 'Slave ID 'modbus function 'Read start adress 'Target Datatype 'quantity of objects to be read RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, _ eReadFunction.F03_Read_Holding_Registers, _ 0, _ eDataType.[BYTE], _ 8) 'add Request to Collection RequestCollection.AddReadRequest("Item2", RequestItem) Console.WriteLine("add ReadRequest " & RequestItem.ToString()) 'reading 2 holding register at adress 12 'Slave ID 'modbus function 'Read start adress 'Target Datatype 'quantity of objects to be read RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, _ eReadFunction.F03_Read_Holding_Registers, _ 12, _ eDataType.[USHORT], _ 2) 'add Request to Collection RequestCollection.AddReadRequest("Item3", RequestItem) Console.WriteLine("add ReadRequest " & RequestItem.ToString()) 'reading 2 holding register at adress 20 'Slave ID 'modbus function 'Read start adress 'Target Datatype 'quantity of objects to be read 'Address of first Bit by reading register RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, _ eReadFunction.F01_Read_Coils, _ 2, _ eDataType.[BOOLEAN], _ 20, _ 0) 'add Request to Collection RequestCollection.AddReadRequest("Item4", RequestItem) Console.WriteLine("add ReadRequest " & RequestItem.ToString()) 'reading 8 coils at adress 8 'Slave ID 'modbus function 'Read start adress 'Target Datatype 'quantity of objects to be read 'Address of first Bit by reading register RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, _ eReadFunction.F01_Read_Coils, _ 8, _ eDataType.[BOOLEAN], _ 8, _ 0) 'add Request to Collection RequestCollection.AddReadRequest("Item5", RequestItem) Console.WriteLine("add ReadRequest " & RequestItem.ToString()) '#End Region 'enable optimize mode RequestCollection.Optmize = True Console.WriteLine(RequestCollection.ToString()) 'read from device Dim ResultCollection As ReadResultCollection = Device.Read(RequestCollection) 'evaluate results Console.WriteLine((DateTime.Now.ToString() & ": ") + ResultCollection.Message) 'find itemresult with foreach-loop Dim sb As New StringBuilder() For Each res As ReadResult In ResultCollection.GetReadItemResult() sb.Append("Start Item:") sb.Append(res.RequestKey) sb.Append(" ") sb.Append("Quality:") sb.Append(" ") sb.Append(res.Quality.ToString()) sb.Append(Environment.NewLine) If res.Quality = OperationResult.eQuality.GOOD Then Dim Values As Array = res.FetchValues() For i As Integer = 0 To Values.Length - 1 sb.Append(Values.GetValue(i).ToString()) sb.Append(Environment.NewLine) Next sb.Append("End Item:") sb.Append(res.RequestKey) End If Next Console.WriteLine(sb.ToString()) Console.WriteLine("end read request collection from modbus") Console.WriteLine(Environment.NewLine) End Sub #End Region End Class
import java.text.DateFormat; import java.util.Calendar; import PLCComMB.*; import PLCComMB.Enums.*; public class MasterExample implements iConnectionStateChangeEvent { // //Declare the Modbus master Device private ModbusMaster Device = null; private PortStateEventHandler portStateEventHandler = new PortStateEventHandler( this); public MasterExample() { CreateAndInitDevice(); AccessToModbus(); } private void CreateAndInitDevice() { Device = new ModbusMaster(); Device.setUser("my user name from licence document"); Device.setSerial("my serial from licence document"); try { //create new interface instance (if not applicable please uncomment) // "TCP" interface: Device.setConnector_TCP("192.168.1.100", 502); //or (if not applicable please uncomment) // "UDP" interface: //Device.SetConnector_UDP("192.168.1.100",502); //or (if not applicable please uncomment) // "RTU" interface: //Device.SetConnector_RTU("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //or (if not applicable please uncomment) // "ASCII interface": //Device.SetConnector_ASCII("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.getConnector().setMaxIdleTime(5000); //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.setRegisterMode(eRegisterMode._16Bit); //register OnConnectionStateChange event Device.getConnector().addConnectionStateEventHandler( portStateEventHandler); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } } @Override public void On_ConnectionStateChange(eConnectionState e) { //do anything System.out.println("Change PortState ==> " + e.toString()); } private void AccessToModbus() { try { //reading Collection from Modbus (FC1-4) readCollection(); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } } private void readCollection() { System.out.println("start read request collection from modbus"); //declare a ReadRequest object ReadRequestCollection RequestCollection = new ReadRequestCollection(); // //set request parameter //declare a ReadRequest object //and set the request parameters >> reading 6 holding register at adress 10 ReadRequest RequestItem = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID eReadFunction.F03_Read_Holding_Registers,//modbus function 10, //Read start adress eDataType.BOOLEAN, //Target Datatype 6, //quantity of objects to be read (byte) 0); //Address of first Bit by reading register //add Request to Collection RequestCollection.addReadRequest("Item1", RequestItem); System.out.println("add ReadRequest " + RequestItem.toString()); //reading 8 holding register at adress 0 RequestItem = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID eReadFunction.F03_Read_Holding_Registers,//modbus function 0, //Read start adress eDataType.BYTE, //Target Datatype 8); //quantity of objects to be read //add Request to Collection RequestCollection.addReadRequest("Item2", RequestItem); System.out.println("add ReadRequest " + RequestItem.toString()); //reading 2 holding register at adress 12 RequestItem = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID eReadFunction.F03_Read_Holding_Registers,//modbus function 12, //Read start adress eDataType.USHORT, //Target Datatype 2); //quantity of objects to be read //add Request to Collection RequestCollection.addReadRequest("Item3", RequestItem); System.out.println("add ReadRequest " + RequestItem.toString()); //reading 2 holding register at adress 20 RequestItem = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID eReadFunction.F01_Read_Coils, //modbus function 2, //Read start adress eDataType.BOOLEAN, //Target Datatype 20, //quantity of objects to be read (byte) 0); //Address of first Bit by reading register //add Request to Collection RequestCollection.addReadRequest("Item4", RequestItem); System.out.println("add ReadRequest " + RequestItem.toString()); //reading 8 coils at adress 8 RequestItem = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID eReadFunction.F01_Read_Coils, //modbus function 8, //Read start adress eDataType.BOOLEAN, //Target Datatype 8, //quantity of objects to be read (byte) 0); //Address of first Bit by reading register //add Request to Collection RequestCollection.addReadRequest("Item5", RequestItem); System.out.println("add ReadRequest " + RequestItem.toString()); // //enable optimize mode RequestCollection.setOptmize(true); System.out.println(RequestCollection.toString()); //read from device ReadResultCollection ResultCollection = Device.read(RequestCollection); //evaluate results System.out.println(DateFormat.getDateTimeInstance().format( Calendar.getInstance().getTime()) + ": " + ResultCollection.getMessage()); //find itemresult with foreach-loop StringBuilder sb = new StringBuilder(); for (ReadResult res : ResultCollection.getReadItemResults()) { sb.append("Start Item:"); sb.append(res.getRequestKey()); sb.append(" "); sb.append("Quality:"); sb.append(" "); sb.append(res.getQuality().toString()); sb.append(System.getProperty("line.separator")); if (res.getQuality().equals(OperationResult.eQuality.GOOD)) { ReadValue[] Values = res.fetchValues(); for (int i = 0; i < Values.length; i++) { sb.append(Values[i].toString()); sb.append(System.getProperty("line.separator")); } sb.append("End Item:"); sb.append(res.getRequestKey()); } } System.out.println(sb.toString()); System.out.println("end read request collection from modbus"); System.out.println(System.getProperty("line.separator")); } }
Beispiel:
Einfaches Erstellen einer Modbus-Master- Instanz.
Nach dem Erstellen wird ein Connector an den Modbus-Master gebunden, in diesem Beispiel ein TCP-Connector.
Nachfolgend Lesen von Daten mehrerer unterschiedlicher Bereiche aus einer SPS in einem gemeinsamen Zugriff. Hierzu wird eine ReadRequestCollection erzeugt und zum Lesen an das Device übergeben. Die hierzu notwendigen Lesezugriffe werden automatisch auf das Notwendigste reduziert und optimiert. Nachfolgend werden die Daten dem Puffer entnommen.
Weitere Beispiele zum Lesen von bestimmen Datentypen entnehmen Sie bitte der Dokumentation oder der Beispielanwendung aus dem Downloadpaket!
Imports PLCcomModbus.Core Imports PLCcomModbus.DataAdapter Imports PLCcomModbus.Master Class MasterExample #Region "CreateAndInitDevice" 'Declare the Modbus master Device Private Device As ModbusMaster = Nothing Public Sub New() CreateAndInitDevice() End Sub Private Sub CreateAndInitDevice() Device = New ModbusMaster() Device.SetUser("my user name from licence document"); Device.SetSerial("my serial from licence document"); Try 'create new interface instance (if not applicable please uncomment) ' "TCP" interface: Device.SetConnector_TCP("192.168.1.21", 502) 'or (if not applicable please uncomment) ' "UDP" interface: 'Device.SetConnector_UDP("192.168.1.100",502) 'or (if not applicable please uncomment) ' "RTU" interface: 'Device.SetConnector_RTU("COM1", _ ' eBaudrate.b9600, _ ' eDataBits.DataBits8, _ ' System.IO.Ports.Parity.None, _ ' System.IO.Ports.StopBits.One, _ ' System.IO.Ports.Handshake.None) 'or (if not applicable please uncomment) ' "ASCII interface": 'Device.SetConnector_ASCII("COM1", _ ' eBaudrate.b9600, _ ' eDataBits.DataBits8, _ ' System.IO.Ports.Parity.None, _ ' System.IO.Ports.StopBits.One, _ ' System.IO.Ports.Handshake.None) 'set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.Connector.SetMaxIdleTime(5000) 'Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.RegisterMode = eRegisterMode._16Bit 'register OnConnectionStateChange event AddHandler Device.Connector.OnConnectionStateChange, AddressOf Device_OnConnectionStateChange 'write data writeModbus() Catch ex As Exception Console.WriteLine(ex.Message) Return End Try End Sub Private Sub Device_OnConnectionStateChange(sender As Object, e As eConnectionState) 'do anything Console.WriteLine("Change PortState ==> " & e.ToString()) End Sub #End Region #Region "Write" Private Sub writeModbus() Console.WriteLine("start writing modbus") 'declare a WriteRequest object and 'and set the request parameters >> //write multiple register at adress 100 'Slave ID 'modbus function 'write start adress Dim myWriteRequest As WriteRequest = RequestBuilder.WriteRequestBuilder.Create(1, _ eWriteFunction.F16_Write_Multiple_Registers, _ 100) 'set eventual byte order, standard = eByteOrder.AB_CD; myWriteRequest.ByteOrder = eByteOrder.AB_CD 'write 4 holding register at adress 100 'add writable data to request myWriteRequest.AddShortRange(New Short() {11, 12, 13, 14}) Console.WriteLine(myWriteRequest.ToString()) 'write Dim res As WriteResult = Device.Write(myWriteRequest) 'evaluate results Console.WriteLine((DateTime.Now.ToString() & ": ") + res.Message) Console.WriteLine("end writing modbus") Console.WriteLine(Environment.NewLine) End Sub #End Region End Class
Imports PLCcom Public Class newClass Private Device As PLCcomDevice 'see section 'connect' for declare and connect a PLCcom-Device Private Sub btnWrite_Click(sender As Object, e As EventArgs) Handles btnWrite.Click 'declare a WriteRequest object Dim myWriteRequest As WriteRequest() = New WriteRequest(0) {} myWriteRequest(0) = New WriteRequest() 'set the request parameters 'write 4 bytes in DB100 myWriteRequest(0).Region = eRegion.DataBlock myWriteRequest(0).DB = 100 myWriteRequest(0).StartByte = 0 'add writable Data here myWriteRequest(0).setBuffer(New Byte() {11, 12, 13}) 'write Dim res As WriteResult() = Device.write(myWriteRequest) 'evaluate results txtMessage.Text = (DateTime.Now.ToString() & ": ") + res(0).Message If res(0).Quality.Equals(OperationResult.eQuality.GOOD) Then MessageBox.Show("OK", "Result:", MessageBoxButtons.OK, MessageBoxIcon.Information) Else MessageBox.Show(res(0).Message, "Result:", MessageBoxButtons.OK, MessageBoxIcon.Information) End If End Sub End Class
import java.text.DateFormat; import java.util.Calendar; import PLCComMB.*; import PLCComMB.Enums.*; public class MasterExample implements iConnectionStateChangeEvent { // //Declare the Modbus master Device private ModbusMaster Device = null; private PortStateEventHandler portStateEventHandler = new PortStateEventHandler( this); public MasterExample() { CreateAndInitDevice(); AccessToModbus(); } private void CreateAndInitDevice() { Device = new ModbusMaster(); Device.setUser("my user name from licence document"); Device.setSerial("my serial from licence document"); try { //create new interface instance (if not applicable please uncomment) // "TCP" interface: Device.setConnector_TCP("192.168.1.100", 502); //or (if not applicable please uncomment) // "UDP" interface: //Device.SetConnector_UDP("192.168.1.100",502); //or (if not applicable please uncomment) // "RTU" interface: //Device.SetConnector_RTU("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //or (if not applicable please uncomment) // "ASCII interface": //Device.SetConnector_ASCII("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.getConnector().setMaxIdleTime(5000); //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.setRegisterMode(eRegisterMode._16Bit); //register OnConnectionStateChange event Device.getConnector().addConnectionStateEventHandler( portStateEventHandler); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } } @Override public void On_ConnectionStateChange(eConnectionState e) { //do anything System.out.println("Change PortState ==> " + e.toString()); } private void AccessToModbus() { try { //write data (FC5,6,15,16) writeModbus(); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } } private void writeModbus() { System.out.println("start writing modbus"); //declare a WriteRequest object and //and set the request parameters >> //write multiple register at adress 100 WriteRequest myWriteRequest = RequestBuilder.WriteRequestBuilder .create(1, //Slave ID eWriteFunction.F16_Write_Multiple_Registers,//modbus function 100);//write start adress //set eventual byte order, standard = eByteOrder.AB_CD; myWriteRequest.setByteOrder(eByteOrder.AB_CD); //write 4 holding register at adress 100 //add writable data to request myWriteRequest.addShortRange(new short[] { 11, 12, 13, 14 }); System.out.println(myWriteRequest.toString()); //write WriteResult res = Device.write(myWriteRequest); //evaluate results System.out.println(DateFormat.getDateTimeInstance().format( Calendar.getInstance().getTime()) + ": " + res.getMessage()); System.out.println("end writing modbus"); System.out.println(System.getProperty("line.separator")); } }
Beispiel:
Einfaches Erstellen einer Modbus-Master- Instanz.
Nach dem Erstellen wird ein Connector an den Modbus-Master gebunden, in diesem Beispiel ein TCP-Connector.
Nachfolgend Schreiben von Daten.
Weitere Beispiele zum Schreiben von bestimmten Datentypen entnehmen Sie bitte der Dokumentation oder der Beispielanwendung aus dem Downloadpaket!
using PLCcomModbus.Core; using PLCcomModbus.DataAdapter; using PLCcomModbus.Master; class MasterExample { #region CreateAndInitDevice //Declare the Modbus master Device private ModbusMaster Device = null; public MasterExample() { CreateAndInitDevice(); } private void CreateAndInitDevice() { Device = new ModbusMaster(); Device.SetUser("my user name from licence document"); Device.SetSerial("my serial from licence document"); try { //create new interface instance (if not applicable please uncomment) // "TCP" interface: Device.SetConnector_TCP("192.168.1.21", 502); //or (if not applicable please uncomment) // "UDP" interface: //Device.SetConnector_UDP("192.168.1.100",502); //or (if not applicable please uncomment) // "RTU" interface: //Device.SetConnector_RTU("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //or (if not applicable please uncomment) // "ASCII interface": //Device.SetConnector_ASCII("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.Connector.SetMaxIdleTime(5000); //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.RegisterMode = eRegisterMode._16Bit; //register OnConnectionStateChange event Device.Connector.OnConnectionStateChange += new ModbusConnector.ConnectionStateChangeEventHandler(Device_OnConnectionStateChange); //write data writeModbus(); //read data readModbus(); //reading Collection from Modbus readCollection(); //read write (FC 23) readWriteRegister(); //reading diagnostic info (FC8) modbusDiagnostic(); } catch (Exception ex) { Console.WriteLine(ex.Message); return; } } private void Device_OnConnectionStateChange(object sender, eConnectionState e) { //do anything Console.WriteLine("Change PortState ==> " + e.ToString()); } #endregion #region Diagnostic private void modbusDiagnostic() { Console.WriteLine("start reading modbus diagnostic"); //declare a ReadRequest object //and set the request parameters DiagnosticRequest myDiagnosticRequest = RequestBuilder.DiagnosticRequestBuilder.Create(1, //Slave ID 0); //subfunction Console.WriteLine(myDiagnosticRequest.ToString()); //execute function DiagnosticResult res = Device.GetDiagnostics(myDiagnosticRequest); //evaluate results Console.WriteLine(DateTime.Now.ToString() + ": " + res.Message); if (res.Quality == OperationResult.eQuality.GOOD) { ushort counter = 0; StringBuilder sb = new StringBuilder(); foreach (object value in res.ResultData) { sb.Append(counter++.ToString("0000")); sb.Append(" >> "); sb.Append(value.ToString()); sb.Append(Environment.NewLine); } Console.WriteLine(sb.ToString()); } Console.WriteLine("end reading modbus diagnostic"); Console.WriteLine(Environment.NewLine); } #endregion }
Imports PLCcomModbus.Core Imports PLCcomModbus.DataAdapter Imports PLCcomModbus.Master Class MasterExample #Region "CreateAndInitDevice" 'Declare the Modbus master Device Private Device As ModbusMaster = Nothing Public Sub New() CreateAndInitDevice() End Sub Private Sub CreateAndInitDevice() Device = New ModbusMaster() Device.SetUser("my user name from licence document"); Device.SetSerial("my serial from licence document"); Try 'create new interface instance (if not applicable please uncomment) ' "TCP" interface: Device.SetConnector_TCP("192.168.1.21", 502) 'or (if not applicable please uncomment) ' "UDP" interface: 'Device.SetConnector_UDP("192.168.1.100",502) 'or (if not applicable please uncomment) ' "RTU" interface: 'Device.SetConnector_RTU("COM1", _ ' eBaudrate.b9600, _ ' eDataBits.DataBits8, _ ' System.IO.Ports.Parity.None, _ ' System.IO.Ports.StopBits.One, _ ' System.IO.Ports.Handshake.None) 'or (if not applicable please uncomment) ' "ASCII interface": 'Device.SetConnector_ASCII("COM1", _ ' eBaudrate.b9600, _ ' eDataBits.DataBits8, _ ' System.IO.Ports.Parity.None, _ ' System.IO.Ports.StopBits.One, _ ' System.IO.Ports.Handshake.None) 'set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.Connector.SetMaxIdleTime(5000) 'Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.RegisterMode = eRegisterMode._16Bit 'register OnConnectionStateChange event AddHandler Device.Connector.OnConnectionStateChange, AddressOf Device_OnConnectionStateChange 'reading diagnostic info (FC8) modbusDiagnostic() Catch ex As Exception Console.WriteLine(ex.Message) Return End Try End Sub Private Sub Device_OnConnectionStateChange(sender As Object, e As eConnectionState) 'do anything Console.WriteLine("Change PortState ==> " & e.ToString()) End Sub #End Region #Region "Diagnostic" Private Sub modbusDiagnostic() Console.WriteLine("start reading modbus diagnostic") 'declare a ReadRequest object 'and set the request parameters 'Slave ID 'subfunction Dim myDiagnosticRequest As DiagnosticRequest = RequestBuilder.DiagnosticRequestBuilder.Create(1, 0) Console.WriteLine(myDiagnosticRequest.ToString()) 'execute function Dim res As DiagnosticResult = Device.GetDiagnostics(myDiagnosticRequest) 'evaluate results Console.WriteLine((DateTime.Now.ToString() & ": ") + res.Message) If res.Quality = OperationResult.eQuality.GOOD Then Dim counter As UShort = 0 Dim sb As New StringBuilder() For Each value As Object In res.ResultData sb.Append(counter.ToString("0000")) sb.Append(" >> ") sb.Append(value.ToString()) sb.Append(Environment.NewLine) counter += 1 Next Console.WriteLine(sb.ToString()) End If Console.WriteLine("end reading modbus diagnostic") Console.WriteLine(Environment.NewLine) End Sub #End Region End Class
import java.text.DateFormat; import java.util.Calendar; import PLCComMB.*; import PLCComMB.Enums.*; public class MasterExample implements iConnectionStateChangeEvent { // //Declare the Modbus master Device private ModbusMaster Device = null; private PortStateEventHandler portStateEventHandler = new PortStateEventHandler( this); public MasterExample() { CreateAndInitDevice(); AccessToModbus(); } private void CreateAndInitDevice() { Device = new ModbusMaster(); Device.setUser("my user name from licence document"); Device.setSerial("my serial from licence document"); try { //create new interface instance (if not applicable please uncomment) // "TCP" interface: Device.setConnector_TCP("192.168.1.100", 502); //or (if not applicable please uncomment) // "UDP" interface: //Device.SetConnector_UDP("192.168.1.100",502); //or (if not applicable please uncomment) // "RTU" interface: //Device.SetConnector_RTU("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //or (if not applicable please uncomment) // "ASCII interface": //Device.SetConnector_ASCII("COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // System.IO.Ports.Parity.None, // System.IO.Ports.StopBits.One, // System.IO.Ports.Handshake.None); //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms Device.getConnector().setMaxIdleTime(5000); //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave Device.setRegisterMode(eRegisterMode._16Bit); //register OnConnectionStateChange event Device.getConnector().addConnectionStateEventHandler( portStateEventHandler); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } } @Override public void On_ConnectionStateChange(eConnectionState e) { //do anything System.out.println("Change PortState ==> " + e.toString()); } private void AccessToModbus() { try { //reading diagnostic info (FC8) modbusDiagnostic(); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } } private void modbusDiagnostic() { System.out.println("start reading modbus diagnostic"); //declare a ReadRequest object //and set the request parameters DiagnosticRequest myDiagnosticRequest = RequestBuilder.DiagnosticRequestBuilder .create(1, //Slave ID 0); //subfunction System.out.println(myDiagnosticRequest.toString()); //execute function DiagnosticResult res = Device.getDiagnostics(myDiagnosticRequest); //evaluate results System.out.println(DateFormat.getDateTimeInstance().format( Calendar.getInstance().getTime()) + ": " + res.getMessage()); if (res.getQuality().equals(OperationResult.eQuality.GOOD)) { int counter = 0; StringBuilder sb = new StringBuilder(); for (Object value : res.getResultData()) { sb.append(String.valueOf(counter++)); sb.append(" >> "); sb.append(value.toString()); sb.append(System.getProperty("line.separator")); } System.out.println(sb.toString()); } System.out.println("end reading modbus diagnostic"); System.out.println(System.getProperty("line.separator")); } }
Beispiel:
Einfaches Erstellen einer Modbus-Master- Instanz.
Nach dem Erstellen wird ein Connector an den Modbus-Master gebunden, in diesem Beispiel ein TCP-Connector.
Nachfolgend Lesen der Diagnosedaten
using System; using System.Collections.Generic; using PLCcomModbus.Core; using PLCcomModbus.DataAdapter; using PLCcomModbus.Slave; class SlaveExample : IDisposable { public SlaveExample() { CreateAndInitDevice(); } private ModbusSlave slave = null; private void CreateAndInitDevice() { Console.WriteLine("starting modbus slave"); //create new modbus slave with slave id 1 slave = new ModbusSlave("", "", 1); Console.WriteLine(slave.ToString()); } }
Imports System.Collections.Generic Imports System.IO.Ports Imports System.Text Imports PLCcomModbus.Core Imports PLCcomModbus.DataAdapter Imports PLCcomModbus.Slave Class SlaveExample Implements IDisposable Public Sub New() CreateAndInitDevice() End Sub #Region "CreateAndInitDevice" Private slave As ModbusSlave = Nothing Private Sub CreateAndInitDevice() Console.WriteLine("starting modbus slave") 'create new modbus slave with slave id 1 slave = New ModbusSlave("", _ "", _ 1) Console.WriteLine(slave.ToString()) End Sub #End Region End Class
import PLCComMB.*; import PLCComMB.Enums.*; import PLCComMB.UnsignedDatatypes.*; public class SlaveExample { // private ModbusSlave slave = null; public SlaveExample() { CreateAndInitDevice(); } private void CreateAndInitDevice() { try { System.out.println("starting modbus slave"); //create new modbus slave with slave id 1 slave = new ModbusSlave("", "", 1); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } catch (Throwable ex) { System.out.println(ex.getMessage()); } } // }
Beispiel:
Erstellen einer Modbus-Slave Instanz.
using System; using System.Collections.Generic; using PLCcomModbus.Core; using PLCcomModbus.DataAdapter; using PLCcomModbus.Slave; class SlaveExample : IDisposable { public SlaveExample() { CreateAndInitDevice(); } #region CreateAndInitDevice private ModbusSlave slave = null; private void CreateAndInitDevice() { Console.WriteLine("starting modbus slave"); //create new modbus slave with slave id 1 slave = new ModbusSlave("", "", 1); Console.WriteLine(slave.ToString()); //Add one or more listener //add TCP listener slave.AddOrReplaceListener_TCP("listener_tcp1", 502); //add UDP listener slave.AddOrReplaceListener_UDP("listener_udp1", 502); //or add RTU listener //slave.AddOrReplaceListener_RTU("listener_rtu1", // "COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // Parity.None, // StopBits.One, // Handshake.None); //or add ASCII listener //slave.AddOrReplaceListener_ASCII("listener_ascii1", // "COM2", // eBaudrate.b9600, // eDataBits.DataBits8, // Parity.None, // StopBits.One, // Handshake.None); } #endregion }
Imports System.Collections.Generic Imports System.IO.Ports Imports System.Text Imports PLCcomModbus.Core Imports PLCcomModbus.DataAdapter Imports PLCcomModbus.Slave Class SlaveExample Implements IDisposable Public Sub New() CreateAndInitDevice() End Sub #Region "CreateAndInitDevice" Private slave As ModbusSlave = Nothing Private Sub CreateAndInitDevice() Console.WriteLine("starting modbus slave") 'create new modbus slave with slave id 1 slave = New ModbusSlave("", _ "", _ 1) Console.WriteLine(slave.ToString()) 'add TCP listener slave.AddOrReplaceListener_TCP("listener_tcp1", 502) 'add UDP listener slave.AddOrReplaceListener_UDP("listener_udp1", 502) 'or add RTU listener 'slave.AddOrReplaceListener_RTU("listener_rtu1", ' "COM1", ' eBaudrate.b9600, ' eDataBits.DataBits8, ' Parity.None, ' StopBits.One, ' Handshake.None) 'or add ASCII listener 'slave.AddOrReplaceListener_ASCII("listener_ascii1", ' "COM2", ' eBaudrate.b9600, ' eDataBits.DataBits8, ' Parity.None, ' StopBits.One, ' Handshake.None) End Sub #End Region #Region "IDisposable Member" Public Sub Dispose() Implements IDisposable.Dispose StopSlave() End Sub #End Region End Class
import PLCComMB.*; import PLCComMB.Enums.*; import PLCComMB.UnsignedDatatypes.*; public class SlaveExample { // private ModbusSlave slave = null; public SlaveExample() { CreateAndInitDevice(); } private void CreateAndInitDevice() { try { System.out.println("starting modbus slave"); //create new modbus slave with slave id 1 slave = new ModbusSlave("", "", 1); System.out.println(slave.toString()); //Add one or more listener //add TCP listener slave.addOrReplaceListener_TCP("listener_tcp1", 502); //add UDP listener slave.addOrReplaceListener_UDP("listener_udp1", 502); //or add RTU listener slave.addOrReplaceListener_RTU("listener_rtu1", "COM1", eBaudrate.b9600, eDataBits.DataBits8, eParity.None, eStopBits.One, eFlowControl.None); //or add ASCII listener slave.addOrReplaceListener_ASCII("listener_ascii1", "COM2", eBaudrate.b9600, eDataBits.DataBits8, eParity.None, eStopBits.One, eFlowControl.None); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } catch (Throwable ex) { System.out.println(ex.getMessage()); } } // }
Beispiel:
Nach dem Erstellen einer Modbus-Slave- Instanz werden verschiedene Listener an den Slave gebunden und stellen hiermit verschiedene Kommunikationswege bereit.
using System; using System.Collections.Generic; using PLCcomModbus.Core; using PLCcomModbus.DataAdapter; using PLCcomModbus.Slave; class SlaveExample : IDisposable { public SlaveExample() { CreateAndInitDevice(); } #region CreateAndInitDevice private ModbusSlave slave = null; private void CreateAndInitDevice() { Console.WriteLine("starting modbus slave"); //create new modbus slave with slave id 1 slave = new ModbusSlave("testuser", "86882-21148-109248-1867141", 1); //slave = new ModbusSlave("", // "", // 1); Console.WriteLine(slave.ToString()); //register slave events slave.OnPortStateChange += slave_OnPortStateChange;//event is triggered by changing state of communication port slave.OnIncomingLogEntry += slave_OnIncomingLogEntry; //event is triggered with a new log entry //register datastore events slave.OnDataStoreItemChange += slave_OnDataStoreItemChange; //event is triggered by changing of datastore slave.OnDataStoreItemRead += slave_OnDataStoreItemRead;//event is triggered by reading from datastore //Add one or more listener //add TCP listener slave.AddOrReplaceListener_TCP("listener_tcp1", 502); //add UDP listener slave.AddOrReplaceListener_UDP("listener_udp1", 502); //or add RTU listener //slave.AddOrReplaceListener_RTU("listener_rtu1", // "COM1", // eBaudrate.b9600, // eDataBits.DataBits8, // Parity.None, // StopBits.One, // Handshake.None); //or add ASCII listener //slave.AddOrReplaceListener_ASCII("listener_ascii1", // "COM2", // eBaudrate.b9600, // eDataBits.DataBits8, // Parity.None, // StopBits.One, // Handshake.None); } void slave_OnDataStoreItemRead(List e) { //do anything } void slave_OnDataStoreItemChange(List e) { //do anything } void slave_OnIncomingLogEntry(LogEntry[] e) { //do anything //write LogEntry into listview foreach (LogEntry le in e) { Console.WriteLine(le.ToString()); } } void slave_OnPortStateChange(object sender, eConnectionState e) { //do anything Console.WriteLine("Change PortState ==> " + e.ToString()); } #endregion #region getvalues public object GetValues(ushort ModBusAddress, eModbusRegion Region) { return slave.GetValue(ModBusAddress, Region); } #endregion #region setvalues public void SetValues(ushort ModBusAddress, eModbusRegion Region, bool Value) { //set value of addressed coil to the passed value slave.SetValue(ModBusAddress, Region, Value); } public void SetValues(ushort ModBusAddress, eModbusRegion Region, ushort Value) { //set value of addressed holding register to the passed 16bit value (only in 16bit register mode) slave.SetValue(ModBusAddress, Region, Value); } public void SetValues(ushort ModBusAddress, eModbusRegion Region, uint Value) { //set value of addressed holding register to the passed 32bit value slave.SetValue(ModBusAddress, Region, Value); } #endregion #region stop slave public void StopSlave() { Console.WriteLine("stop modbus slave"); //unregister Datastore events slave.OnDataStoreItemChange -= slave_OnDataStoreItemChange; slave.OnDataStoreItemRead -= slave_OnDataStoreItemRead; //unload existing listener List ModbusListenerItems = new List(slave.Listener.Values); foreach (ModbusListener ml in ModbusListenerItems) { slave.RemoveListener(ml.Name); } //unregister slave events slave.OnIncomingLogEntry -= slave_OnIncomingLogEntry; slave.OnPortStateChange -= slave_OnPortStateChange; slave.Listener.Clear(); //dispose modbus slave slave.Dispose(); slave = null; } #endregion #region IDisposable Member public void Dispose() { StopSlave(); } #endregion }
Imports System.Collections.Generic Imports System.IO.Ports Imports System.Text Imports PLCcomModbus.Core Imports PLCcomModbus.DataAdapter Imports PLCcomModbus.Slave Class SlaveExample Implements IDisposable Public Sub New() CreateAndInitDevice() End Sub #Region "CreateAndInitDevice" Private slave As ModbusSlave = Nothing Private Sub CreateAndInitDevice() Console.WriteLine("starting modbus slave") 'create new modbus slave with slave id 1 slave = New ModbusSlave("testuser", "86882-21148-109248-1867141", 1) 'slave = new ModbusSlave("", ' "", ' 1); Console.WriteLine(slave.ToString()) 'register slave events AddHandler slave.OnPortStateChange, AddressOf slave_OnPortStateChange 'event is triggered by changing state of communication port AddHandler slave.OnIncomingLogEntry, AddressOf slave_OnIncomingLogEntry 'event is triggered with a new log entry 'register datastore events AddHandler slave.OnDataStoreItemChange, AddressOf slave_OnDataStoreItemChange 'event is triggered by changing of datastore AddHandler slave.OnDataStoreItemRead, AddressOf slave_OnDataStoreItemRead 'event is triggered by reading from datastore 'Add one or more listener 'add TCP listener slave.AddOrReplaceListener_TCP("listener_tcp1", 502) 'add UDP listener slave.AddOrReplaceListener_UDP("listener_udp1", 502) 'or add RTU listener 'slave.AddOrReplaceListener_RTU("listener_rtu1", ' "COM1", ' eBaudrate.b9600, ' eDataBits.DataBits8, ' Parity.None, ' StopBits.One, ' Handshake.None) 'or add ASCII listener 'slave.AddOrReplaceListener_ASCII("listener_ascii1", ' "COM2", ' eBaudrate.b9600, ' eDataBits.DataBits8, ' Parity.None, ' StopBits.One, ' Handshake.None) End Sub Private Sub slave_OnDataStoreItemRead(e As List(Of DataStoreItemReadEventArgs)) 'do anything End Sub Private Sub slave_OnDataStoreItemChange(e As List(Of DataStoreItemChangeEventArgs)) 'do anything End Sub Private Sub slave_OnIncomingLogEntry(e As LogEntry()) 'do anything 'write LogEntry into listview For Each le As LogEntry In e Console.WriteLine(le.ToString()) Next End Sub Private Sub slave_OnPortStateChange(sender As Object, e As eConnectionState) 'do anything Console.WriteLine("Change PortState ==> " & e.ToString()) End Sub #End Region #Region "getvalues" Public Function GetValues(ModBusAddress As UShort, Region As eModbusRegion) As Object Return slave.GetValue(ModBusAddress, Region) End Function #End Region #Region "setvalues" Public Sub SetValues(ModBusAddress As UShort, Region As eModbusRegion, Value As Boolean) 'set value of addressed coil to the passed value slave.SetValue(ModBusAddress, Region, Value) End Sub Public Sub SetValues(ModBusAddress As UShort, Region As eModbusRegion, Value As UShort) 'set value of addressed holding register to the passed 16bit value (only in 16bit register mode) slave.SetValue(ModBusAddress, Region, Value) End Sub Public Sub SetValues(ModBusAddress As UShort, Region As eModbusRegion, Value As UInteger) 'set value of addressed holding register to the passed 32bit value slave.SetValue(ModBusAddress, Region, Value) End Sub #End Region #Region "stop slave" Public Sub StopSlave() Console.WriteLine("stop modbus slave") 'unregister Datastore events RemoveHandler slave.OnDataStoreItemChange, AddressOf slave_OnDataStoreItemChange RemoveHandler slave.OnDataStoreItemRead, AddressOf slave_OnDataStoreItemRead 'unload existing listener Dim ModbusListenerItems As New List(Of ModbusListener)(slave.Listener.Values) For Each ml As ModbusListener In ModbusListenerItems slave.RemoveListener(ml.Name) Next 'unregister slave events RemoveHandler slave.OnIncomingLogEntry, AddressOf slave_OnIncomingLogEntry RemoveHandler slave.OnPortStateChange, AddressOf slave_OnPortStateChange slave.Listener.Clear() 'dispose modbus slave slave.Dispose() slave = Nothing End Sub #End Region #Region "IDisposable Member" Public Sub Dispose() Implements IDisposable.Dispose StopSlave() End Sub #End Region End Class
import java.util.List; import PLCComMB.*; import PLCComMB.Enums.*; import PLCComMB.UnsignedDatatypes.*; public class SlaveExample implements iConnectionStateChangeEvent, iIncomingLogEntryEvent, iDataStoreItemChangeEvent, iDataStoreItemReadEvent { // private ModbusSlave slave = null; private IncomingLogEntryEventHandler incomingLogEntryEventHandler = new IncomingLogEntryEventHandler( this); private DataStoreItemChangeEventHandler dataStoreItemChangeEventHandler = new DataStoreItemChangeEventHandler( this); private DataStoreItemReadEventHandler dataStoreItemReadEventHandler = new DataStoreItemReadEventHandler( this); private PortStateEventHandler portStateEventHandler = new PortStateEventHandler( this); public SlaveExample() { CreateAndInitDevice(); } private void CreateAndInitDevice() { try { System.out.println("starting modbus slave"); //create new modbus slave with slave id 1 slave = new ModbusSlave("", "", 1); System.out.println(slave.toString()); //register slave events slave.addIncomingLogEntryEventHandler(incomingLogEntryEventHandler);//event is triggered with a new log entry slave.addDataStoreItemChangeEventHandler(dataStoreItemChangeEventHandler);//event is triggered by changing of datastore slave.addDataStoreItemReadEventHandler(dataStoreItemReadEventHandler);//event is triggered by reading from datastore slave.addPortStateEventHandler(portStateEventHandler);//event is triggered by changing state of communication port //Add one or more listener //add TCP listener slave.addOrReplaceListener_TCP("listener_tcp1", 502); //add UDP listener slave.addOrReplaceListener_UDP("listener_udp1", 502); //or add RTU listener slave.addOrReplaceListener_RTU("listener_rtu1", "COM1", eBaudrate.b9600, eDataBits.DataBits8, eParity.None, eStopBits.One, eFlowControl.None); //or add ASCII listener slave.addOrReplaceListener_ASCII("listener_ascii1", "COM2", eBaudrate.b9600, eDataBits.DataBits8, eParity.None, eStopBits.One, eFlowControl.None); } catch (Exception ex) { System.out.println(ex.getMessage()); return; } catch (Throwable ex) { System.out.println(ex.getMessage()); } } @Override public void OnDataStoreItemRead(List arg) { //do anything } @Override public void OnDataStoreItemChange(List arg) { //do anything } @Override public void OnIncomingLogEntry(LogEntry[] e) { //do anything //write LogEntry into listview for (LogEntry le : e) { System.out.println(le.toString()); } } @Override public void On_ConnectionStateChange(eConnectionState e) { //do anything System.out.println("Change PortState ==> " + e.toString()); } // // public Object getValues(UShort ModBusAddress, eModbusRegion Region) { return slave.getValue(ModBusAddress, Region); } // // public void setValues(UShort ModBusAddress, eModbusRegion Region, boolean Value) { //set value of addressed coil to the passed value slave.setValue(ModBusAddress, Region, Value); } public void setValues(UShort ModBusAddress, eModbusRegion Region, UShort Value) { //set value of addressed holding register to the passed 16bit value (only in 16bit register mode) slave.setValue(ModBusAddress, Region, Value); } public void setValues(UShort ModBusAddress, eModbusRegion Region, UInteger Value) { //set value of addressed holding register to the passed 32bit value slave.setValue(ModBusAddress, Region, Value); } // // public void StopSlave() { System.out.println("stop modbus slave"); // unload existing listener String[] ListenerKeys = slave.getListener().keySet() .toArray(new String[slave.getListener().keySet().size()]); for (String key : ListenerKeys) { slave.removeListener(key); } // unregister slave events slave.removeIncomingLogEntryEventHandler(incomingLogEntryEventHandler); slave.removeDataStoreItemChangeEventHandler(dataStoreItemChangeEventHandler); slave.removeDataStoreItemReadEventHandler(dataStoreItemReadEventHandler); slave.removePortStateEventHandler(portStateEventHandler); // dispose modbus slave slave.unload(); slave = null; } // }
Beispiel:
Code eines einfachen Modbus-Slave mit verschienenen Listenern und der Möglichkeit, Daten direkt in den Datastore zu schreiben oder von ihm zu lesen.