Example: Protocol configuration in request/response mode
An example of a NetLogic contained in the serial Port
object that uses the request/response mode to read the value of a Modbus controller register every 300 milliseconds.
With the WriteBytes
method, the command is sent through the serial port, and with the subsequent ReadBytes
method, it waits for a response from the controller. If the controller does not respond within the time indicated by the Timeout
property, an exception is generated and the read/write fails.
You can download a sample project from ../../../downloads/SerialPortDemoRequestResponseMode.zip.
public class RuntimeNetlogic1 : BaseNetLogic
{
private SerialPort serialPort;
private PeriodicTask periodicTask;
public override void Start()
{
serialPort = (SerialPort)Owner;
periodicTask = new PeriodicTask(Read, 300, Owner);
periodicTask.Start();
}
private void Read()
{
try
{
ReadImpl();
}
catch (Exception ex)
{
Log.Error("Failed to read from Modbus: " + ex);
}
}
private void ReadImpl()
{
serialPort.WriteBytes(Serialize());
var result = serialPort.ReadBytes(3);
if ((result[1] & 0x80) == 0)
{
result = serialPort.ReadBytes((uint)(result[2] + 2));
Log.Info(Deserialize(result));
}
else
{
Log.Error("Failed to read from Modbus");
}
}
private byte[] Serialize()
{
var buffer = new byte[]
{
0x01, // UnitId
0x03, // Function code
0x00, // Starting address
0x00,
0x00, // Quantity Of Registers
0x01,
0x84, // CRC
0x0a
};
return buffer;
}
private ushort Deserialize(byte[] buffer)
{
var first = (ushort)buffer[1];
var second = (ushort)(buffer[0] << 8);
return (ushort)(first | second);
}
}