Đăng Ký
Kết quả 1 đến 2 của 2
  1. #1
    Thành viên cấp 1
    Ngày tham gia
    Feb 2012
    Bài viết
    46
    Thanks
    1
    34 lượt trong 10 bài viết

    Post Một ví dụ đơn giản về giao thức Modbus RTU sử dụng C#.



    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ú ý:
    1. Ví dụ viết trên Visual C# 2012.
    2. 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:
    1. Example.rar
    2. Protocol Description.pdf


  2. #2
    Thành viên Mới
    Ngày tham gia
    Nov 2013
    Bài viết
    4
    Thanks
    2
    Thanked 5 Times in 1 Post
    Hoặc có hàm tính CRC này thấy dễ xem hơn .
    Khi sử dụng, thì hãy truyền vào 1 mảng, kiểu dữ liệu là byte và "len" là số byte của chuỗi truyền.
    Ví dụ: Với chuỗi "01 03 00 01 00 04". Ta khai báo 1 mảng byte mang[];
    Hãy gán giá trị cho mảng như sau: mang[0] = Convert.ToByte("01",16) ....và tiếp tục với
    các giá trị còn lại còn lại.
    chuỗi truyền có 6 byte nên "len = 6";
    Khi sử dụng thì hãy gọi hàm ModRTU_CRC(mang,len);


    Code:
    UInt16 ModRTU_CRC(byte[] buf, int len)
    {
    UInt16 crc = 0xFFFF;
    
    for (int pos = 0; pos < len; pos++) {
    crc ^= (UInt16)buf[pos]; // XOR byte into least sig. byte of crc
    
    for (int i = 8; i != 0; i--) { // Loop over each bit
    if ((crc & 0x0001) != 0) { // If the LSB is set
    crc >>= 1; // Shift right and XOR 0xA001
    crc ^= 0xA001;
    }
    else // Else LSB is not set
    crc >>= 1; // Just shift right
    }
    }
    // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
    return crc;

    Và đây là 1 video để bạn biết rằng cỡ như mình cũng có thể làm được




    Lời kết: Hãy học hỏi như cái cách mà những người khác đã từng làm.
    Lần sửa cuối bởi LSL_LSL, ngày 02-01-2015 lúc 10:40 PM.

  3. The Following 5 Users Say Thank You to LSL_LSL For This Useful Post:


Đánh dấu

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •  
Back to Top