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

      

  • 相关阅读:
    线程生命周期
    java集合源码分析几篇文章
    Java中的equals和hashCode方法详解
    java集合(一)
    volatile和synchronized实现内存可见性的区别
    动态代理的原理
    过滤器的使用
    pageBean的实体类
    FindUserByPageServlet
    用户信息系统_serviceImpl
  • 原文地址:https://www.cnblogs.com/solokey/p/2113308.html
Copyright © 2020-2023  润新知