• Webdien.com - Cầu nối dân điện


    1. [HOT] - Webdien đang tuyển các vị trí quản lý cao cấp


  • Kết quả 1 đến 4 của 4
    1. #1
      Tham gia
      22-09-2009
      Địa chỉ
      GÓC CHÉM GIÓ
      Bài viết
      1,272
      Cảm ơn
      158
      Được cảm ơn 857 lần, trong 401 bài

      Mặc định Cho hỏi về modbus và cách tạo mã CRC!?

      Chào các anh chị em webdien ^_^
      Lâu nay, để giải quyết vấn đề truyền thông giữa các thiết bị OMRON và PLC OMRON mình xài các Function Block (FB) được tạo sẵn trong lib của OMRON. Tuy nhiên dạo gần đây mình lại đang muốn tìm về cội nguồn của nó. Tất cả đều ok tuy nhiên trong frame của modbus lại yêu cầu mã CRC. Mình cũng đã thử viết 1 đoạn chương trình generate CRC LSB và CRC MSB tuy nhiên kết quả ra lại không giống như trong ví dụ của nó. Nếu anh chị em nào có kinh nghiệm về các thiết bị OMRON cũng như phần giao tiếp của nó thì cho mình hỏi là khi tạo mã CRC, trong quá trình shift qua phải của CRC generation thì mình XOR nó với đoạn data hay toàn bộ đoạn frame trước mã CRC vậy. Mình xài frame với cầu trúc Start - add - function - data - CRC - end. Và trong câu hỏi trên ý mình là mã CRC được tạo dựa trên đoạn mã "Start-add-function-data" hay chỉ là đoạn mã "data"
      Xin cảm ơn các cao thủ ^_^

      Sau đây là đoạn ví dụ: ghi giá trị tấn số đa bậc ( địa chỉ thanh ghi A020) 50hz vào inverter có địa chỉ là 8. Do resolution của nó là 0.1Hz nên giá trị cần ghi là 500 tương ứng với số nhị phân là 01F4hex. Lúc này frame truyền của nó là
      08-06-10-28-01-F4-0D-8C
      tương ứng với
      add-function code-R add MSB - R add LSB - changed data MSB - changed data LSB - CRC16 MSB - CRC16 LSB
      Đoạn frame này không có ST ED. Mình thử tính đoạn CRC nhưng ra kết quả không giống như ví dụ trên (0D8C) mà là một kết quả khác và mình muốn hỏi là vì sao >"<

      --------------------------------------------------------------------------------
      Xem bài viết cùng chuyên mục:

      CÓ LẼ ĐÃ ĐẾN LÚC PHẢI DỪNG ...!

    2. #2
      Tham gia
      14-05-2010
      Bài viết
      449
      Cảm ơn
      338
      Được cảm ơn 244 lần, trong 129 bài

      Mặc định Ðề: Cho hỏi về modbus và cách tạo mã CRC!?

      Trích dẫn Gửi bởi Linhvancong Xem bài viết
      Chào các anh chị em webdien ^_^
      Lâu nay, để giải quyết vấn đề truyền thông giữa các thiết bị OMRON và PLC OMRON mình xài các Function Block (FB) được tạo sẵn trong lib của OMRON. Tuy nhiên dạo gần đây mình lại đang muốn tìm về cội nguồn của nó. Tất cả đều ok tuy nhiên trong frame của modbus lại yêu cầu mã CRC. Mình cũng đã thử viết 1 đoạn chương trình generate CRC LSB và CRC MSB tuy nhiên kết quả ra lại không giống như trong ví dụ của nó. Nếu anh chị em nào có kinh nghiệm về các thiết bị OMRON cũng như phần giao tiếp của nó thì cho mình hỏi là khi tạo mã CRC, trong quá trình shift qua phải của CRC generation thì mình XOR nó với đoạn data hay toàn bộ đoạn frame trước mã CRC vậy. Mình xài frame với cầu trúc Start - add - function - data - CRC - end. Và trong câu hỏi trên ý mình là mã CRC được tạo dựa trên đoạn mã "Start-add-function-data" hay chỉ là đoạn mã "data"
      Xin cảm ơn các cao thủ ^_^

      Sau đây là đoạn ví dụ: ghi giá trị tấn số đa bậc ( địa chỉ thanh ghi A020) 50hz vào inverter có địa chỉ là 8. Do resolution của nó là 0.1Hz nên giá trị cần ghi là 500 tương ứng với số nhị phân là 01F4hex. Lúc này frame truyền của nó là
      08-06-10-28-01-F4-0D-8C
      tương ứng với
      add-function code-R add MSB - R add LSB - changed data MSB - changed data LSB - CRC16 MSB - CRC16 LSB
      Đoạn frame này không có ST ED. Mình thử tính đoạn CRC nhưng ra kết quả không giống như ví dụ trên (0D8C) mà là một kết quả khác và mình muốn hỏi là vì sao >"<
      truyền thông công nghiệp,(profibus,modbus ..)mảng này em thấy khá hay, nhưng nhiều cái rắc rối, bác tìm hiểu simen thì có thể trao đổi được thằng này chứ omron thì em chịu chưa tìm hiểu thằng này. mong sẽ có ai đó giúp bạn.
      trinhvanhoa_to live is to fight

    3. #3
      Tham gia
      08-11-2012
      Bài viết
      24
      Cảm ơn
      2
      Thanked 1 Time in 1 Post

      Mặc định Re: Cho hỏi về modbus và cách tạo mã CRC!?

      đào mộ cái, nhưng nghĩ chắc sẽ có người cần nó

      int[] intSend = new int[8];
      intSend[0] = 0x01; // ID of slave device
      intSend[1] = 0x03; // code of the command
      intSend[2] = 0x1D; // Register address 0x1D63
      intSend[3] = 0x63; // Register address 0x1D63
      intSend[4] = 0x00; // First 8 bits of the data
      intSend[5] = 0x02; // Second 8 bits of the data

      int int_crc = 0xFFFF;
      int int_lsb;
      int int_crc_byte_a, int_crc_byte_b;

      for (int int_i = 0; int_i < intSend.Length - 2; int_i++)
      {
      int_crc = int_crc ^ intSend[int_i];
      for (int int_j = 0; int_j < 8; int_j++)
      {
      int_lsb = int_crc & 0x0001; // Mask of LSB
      int_crc = int_crc >> 1;
      int_crc = int_crc & 0x7FFF;
      if (int_lsb == 1) int_crc = int_crc ^ 0xA001;
      }
      }


      Mình sẽ cho các bạn 1 đoạn mã để thử như sau :
      "01 03 00 01 00 04" có mã CRC = 15 C9

      Nguồn code: http://www.cirvirlab.com/index.php/c...odbus-rtu.html
      ldt.ute@gmail.com
      0979.829.469

    4. #4
      Tham gia
      08-11-2012
      Bài viết
      24
      Cảm ơn
      2
      Thanked 1 Time in 1 Post

      Mặc định Re: Ðề: Cho hỏi về modbus và cách tạo mã CRC!?

      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);



      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.
      ldt.ute@gmail.com
      0979.829.469

    Trả lời với tài khoản Facebook

    Các Chủ đề tương tự

    1. Trợ giúp - modbus
      Bởi jinhdalinh trong diễn đàn Các vấn đề ĐK chưa phân loại
      Trả lời: 14
      Bài cuối: 08-03-2017, 01:14
    2. Trợ giúp - Chế độ modbus RTU của PLC Hitachi
      Bởi tung_ha trong diễn đàn PLC
      Trả lời: 0
      Bài cuối: 07-05-2014, 17:00
    3. Trợ giúp - Về lỗi thư viện Modbus Master
      Bởi kuxin91 trong diễn đàn PLC
      Trả lời: 5
      Bài cuối: 08-12-2013, 09:47
    4. Trợ giúp - Thư viện hàm Modbus
      Bởi levandinh89 trong diễn đàn PLC
      Trả lời: 80
      Bài cuối: 25-10-2013, 15:27
    5. Trợ giúp - Bài tập mạng truyền thông Modbus
      Bởi levandinh89 trong diễn đàn SCADA - HMI
      Trả lời: 0
      Bài cuối: 13-07-2012, 08:47
    Văn Võ Trạng Nguyên
    Hắc Hiệp Đại Chiến Thánh Bài 2
    Đặc Cảnh Diệt Ma
    Khử Ma Đạo Trưởng
    Cương Thi Diệt Tà
    Sự Hình Thành Của Đế Chế Mông Cổ
    NHỮNG KHOẢNH KHẮC ĐÁNG NHỚ CỦA GIẢI GOLF PHÚ MỸ HƯNG 2016