Delta PLC Read/Write internal relay M in C#

Vengito
2 min readApr 13, 2021

Delta PLC provides Modbus communication library DMT, which can be used in C# ​​to communicate with Delta PLC over RS485 (Modbus).

First of all to use DMT with your application following functions should be imported from kernel32.dll and DMT.dll:

using System.Reflection;[DllImport("kernel32.dll", CharSet = CharSet.Auto)]static extern IntPtr LoadLibrary(string dllPath);[DllImport("kernel32.dll", CharSet = CharSet.Auto)]static extern bool FreeLibrary(IntPtr hDll);// Serial Communication[DllImport("DMT.dll", CharSet = CharSet.Auto)]static extern int OpenModbusSerial(int conn_num, int baud_rate, int data_len, char parity, int stop_bits, int modbus_mode);[DllImport("DMT.dll", CharSet = CharSet.Auto)]static extern void CloseSerial(int conn_num);// MODBUS Address Calculation[DllImport("DMT.dll", CharSet = CharSet.Auto)]static extern int DevToAddrW(string series, string device, int qty);// Wrapped MODBUS Funcion : 0x02[DllImport("DMT.dll", CharSet = CharSet.Auto)]static extern int ReadInputsW(int comm_type, int conn_num, int slave_addr, int dev_addr, int qty, UInt32[] data_r, StringBuilder req, StringBuilder res);// Wrapped MODBUS Funcion : 0x05[DllImport("DMT.dll", CharSet = CharSet.Auto)]static extern int WriteSingleCoilW(int comm_type, int conn_num, int slave_addr, int dev_addr, UInt32 data_w, StringBuilder req, StringBuilder res);

To load DMT.dll call “LoadLibrary” from kernel32.dll at the beginning and do not forget to call “FreeLibrary” from kernel32.dll at the end:

System.IntPtr hDMTDll = LoadLibrary(AppDomain.CurrentDomain.BaseDirectory + "DMT.dll"); 
// explicitly link to DMT.dll

We need also a delegate to disconnect from serial:

int conn_num = 1; //COM Port (COM1)delegate void DelegateClose(int conn_num); // function pointer for disconnectionDelegateClose CloseModbus = new DelegateClose(CloseSerial);CloseModbus = CloseSerial;

Then we should open serial connection to start communication:

int modbus_mode = 1; // 1:ASCII , 2:RTUint baud_rate = 9600;int data_len = 7;char parity = 'E'; // Evenint stop_bits = 1;int plc_node = 1; //Modbus node numberint status = OpenModbusSerial(conn_num, baud_rate, data_len, parity, stop_bits, modbus_mode);

If variable “status” is bigger than zero, it means we are successfully connected. Example code to write zero (false) to internal relay M21:

StringBuilder req = new StringBuilder(1024);StringBuilder res = new StringBuilder(1024);if (status > 0){int addr = DevToAddrW("DVP", "M21", 1); //Get int address of internal relay M21int sonuc = WriteSingleCoilW(0, conn_num, plc_node, addr, 0, req, res);if (sonuc == -1){MessageBox.Show("Error");}else{MessageBox.Show("Success");}}

Example code to read internal relay M23:

UInt32[] data_from_dev = new UInt32[1];data_from_dev[0] = 0;UInt32[] data_to_dev = new UInt32[1];data_to_dev[0] = 0;int addr = DevToAddrW("DVP", "M23", 1);int sonuc = ReadInputsW(0, conn_num, plc_node, addr, 1, data_from_dev, req, res);if (sonuc != -1){MessageBox.Show("Read Success");if (data_from_dev[0] == 1){MessageBox.Show("M23 is true");}}

To close serial communication:

CloseModbus(conn_num);

With this code example abov you can manage your PLC software from your PC. To use it while entire machine is running put your code in a Thread.

--

--