zoukankan      html  css  js  c++  java
  • ModBus RTU,CRC,数据转换代码

     1 //======================================================================
    2
    3 function ModBusCRC(Data: string): string; //生成modbus CRC数据
    4 var
    5 CRC16Lo, CRC16Hi, CL, CH, UseHi, UseLo: Dword;
    6 i, index: integer;
    7 begin
    8 CRC16Lo := $FF; //CRC16Lo为CRC寄存器低8位
    9 CRC16Hi := $FF; //CRC16Hi为CRC寄存器高8位
    10 CL := $1;
    11 CH := $A0; // A001 H 是CRC-16多项式代码
    12 for i := 1 to Length(Data) do begin
    13 CRC16Lo := CRC16Lo xor ord(Data[i]); //每一个数据与CRC寄存器异或
    14 for index := 0 to 7 do begin
    15 UseHi := CRC16Hi;
    16 UseLo := CRC16Lo;
    17 CRC16Hi := CRC16Hi shr 1;
    18 CRC16Lo := CRC16Lo shr 1; //右移一位
    19 if ((UseHi and $1) = $1) then //如果高位字节最后一位是1的话
    20 CRC16Lo := CRC16Lo or $80; //低位字节右移后前面补1
    21
    22 if ((UseLo and $1) = $1) then begin//如果LSB 为1,则与多项式进行异或
    23 CRC16Hi := CRC16Hi xor CH;
    24 CRC16Lo := CRC16Lo xor CL;
    25 end;
    26 end;
    27 end;
    28
    29 Result := Char(CRC16Lo) + Char(CRC16Hi);
    30 end;

      

     1 function  ModBusDataToSingle(st: string; var Value: Single): Boolean;
    2 var
    3 Pb: PByteArray;
    4 begin
    5 Result := False;
    6 if Length(st) < 4 then
    7 Exit;
    8 Pb := PByteArray(@Value);
    9 Pb[3] := Ord(st[3]);
    10 Pb[2] := Ord(st[4]);
    11 Pb[1] := Ord(st[1]);
    12 Pb[0] := Ord(st[2]);
    13 Result := True;
    14 end;
    15
    16 function ModBusDataToWord(st: string; var Value: Word): Boolean;
    17 begin
    18 Result := False;
    19 if Length(st) < 2 then
    20 Exit;
    21 Value := MakeWord(Ord(st[2]), Ord(st[1]));
    22 Result := True;
    23 end;

      

  • 相关阅读:
    Python:Pandas的基本操作和使用
    奇技淫巧:绝佳笔记篇-wolai
    Scala:(五) 类、对象、继承、模式匹配和样例类
    tree2List
    java mybatis多层collection嵌套查询
    linux 查看目录下各个文件的大小
    Redisson使用手册
    hutool 定时任务 TimedCache
    清理Docker占用的磁盘空间
    java线程池
  • 原文地址:https://www.cnblogs.com/solokey/p/2113308.html
Copyright © 2011-2022 走看看