Mình làm một ví dụ đơn giản lập trình giao thức Modbus RTU sử dụng C# để chia sẻ cho anh em tham khảo.
Bạn nào không có thiết bị thì có thể sử dụng phần mềm mô phỏng thiết bị modbus slave có trong phần example (Chạy file ModbusSlaveSetup.exe để cài đặt modbus Slave).
Test theo video phía trên.
Tài liệu mình gửi kèm cũng rất chi tiết. Các bạn có thể bám vào đó để lập trình cho các Function còn lại.
Ở đây mình lấy Function 03 để làm ví dụ đọc 5 thanh ghi từ thiết bị hỗ trợ modbus slave.
Chú ý:
- Ví dụ viết trên Visual C# 2012.
- Cách tính CRC/LRC cho chế độ Modbus RTU/ASCII. Cái này cực kỳ quan trọng cho giao thức ở chế độ RTU/ASCII.
- CRC:
Code:/// <summary> /// Calculate Cyclical Redundancy Check /// </summary> /// <param name="messageArray">The data used in CRC</param> /// <param name="CRC">The 2 byte CRC</param> public static void CRC(byte[] messageArray, ref byte[] CRC) { ushort CRCFull = 0xFFFF; char CRCLSB; for (int i = 0; i < (messageArray.Length) - 2; i++) { CRCFull = (ushort)(CRCFull ^ messageArray[i]); for (int j = 0; j < 8; j++) { CRCLSB = (char)(CRCFull & 0x0001); CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF); if (CRCLSB == 1) CRCFull = (ushort)(CRCFull ^ 0xA001); } } CRC[1] = (byte)((CRCFull >> 8) & 0xFF); CRC[0] = (byte)(CRCFull & 0xFF); }- LRC:
Code:/// <summary> /// Calculate Longitudinal Redundancy Check. /// </summary> /// <param name="data">The data used in LRC</param> /// <returns>LRC value</returns> public static byte LRC(byte[] data) { if (data == null) throw new ArgumentNullException("Tham số truyền vào không tồn tại phần tử nào"); byte lrc = 0; foreach (byte b in data) lrc += b; lrc = (byte)((lrc ^ 0xFF) + 1); return lrc; }
Download:
Đánh dấu