zoukankan      html  css  js  c++  java
  • 【Delphi】PLC.OMRON.FINS

    OMRON FINS DEMO

    unit PLC.OMRON;
    
    interface
    
    uses
        System.StrUtils, System.SysUtils;
    
    const
        HEAD_CODE = '@';
        DEFAULT_UNIT = 0;
        PC_CODE = 'FA';
        HEAD_BODY = '000000000';
        READ_CMD = '0101';
        WRITE_CMD = '0102';
        DEFAULT_BIT = '00';
        END_CODE = '*' + Chr(13);
        WORD_PER_ASCII = 4;
        BYTE_PER_ASCII = 2;
    
    type
        TFINS = class(TObject)
        public
            { 组装 Bit 读命令 }
            class function BuildReadBitCommand(uno: Integer; area: string; channel: Integer; bit: Integer; num: Integer): string;
            { 组装 Bit 写命令 }
            class function BuildWriteBitCommand(uno: Integer; area: string; channel: Integer; bit: Integer; num: Integer; data: array of Integer): string; overload;
            { 组装 Bit 写命令 }
            class function BuildWriteBitCommand(uno: Integer; area: string; channel: Integer; bit: Integer; num: Integer; hex: string): string; overload;
            { 组装 Word 读命令 }
            class function BuildReadWordCommand(uno: Integer; area: string; channel: Integer; num: Integer): string;
            { 组装 Word 写命令 }
            class function BuildWriteWordCommand(uno: Integer; area: string; channel: Integer; num: Integer; data: array of Integer): string; overload;
            { 组装 Word 写命令 }
            class function BuildWriteWordCommand(uno: Integer; area: string; channel: Integer; num: Integer; hex: string): string; overload;
        end;
    
    ////////////////////////////////////////////////////////////////////////////////
    
        TFCSUtil = class(TObject)
        public
            class function IntArrToHexStr(data: array of Integer): string;
            class function GetFCS(data: string; offset: Integer = 0): string;
            class function CheckFCS(data: string): Boolean;
        end;
    
    implementation
    
    { 组装 Bit 读命令 }
    class function TFINS.BuildReadBitCommand(uno: Integer; area: string; channel: Integer; bit: Integer; num: Integer): string;
    var
        cmd: string;
        fcs: string;
    begin
        cmd := HEAD_CODE + IntToHex(uno, BYTE_PER_ASCII) + PC_CODE + HEAD_BODY + READ_CMD + area + IntToHex(channel, WORD_PER_ASCII) + IntToHex(bit, BYTE_PER_ASCII) + IntToHex(num, WORD_PER_ASCII);
        fcs := TFCSUtil.GetFCS(cmd);
        Result := cmd + fcs + END_CODE;
    end;
    
    { 组装 Bit 写命令 }
    class function TFINS.BuildWriteBitCommand(uno: Integer; area: string; channel: Integer; bit: Integer; num: Integer; data: array of Integer): string;
    var
        cmd: string;
        fcs: string;
    begin
        cmd := HEAD_CODE + IntToHex(uno, BYTE_PER_ASCII) + PC_CODE + HEAD_BODY + WRITE_CMD + area + IntToHex(channel, WORD_PER_ASCII) + IntToHex(bit, BYTE_PER_ASCII) + IntToHex(num, WORD_PER_ASCII) + TFCSUtil.IntArrToHexStr(data);
        fcs := TFCSUtil.GetFCS(cmd);
        Result := cmd + fcs + END_CODE;
    end;
    
    { 组装 Bit 写命令 }
    class function TFINS.BuildWriteBitCommand(uno: Integer; area: string; channel: Integer; bit: Integer; num: Integer; hex: string): string;
    var
        cmd: string;
        fcs: string;
    begin
        cmd := HEAD_CODE + IntToHex(uno, BYTE_PER_ASCII) + PC_CODE + HEAD_BODY + WRITE_CMD + area + IntToHex(channel, WORD_PER_ASCII) + IntToHex(bit, BYTE_PER_ASCII) + IntToHex(num, WORD_PER_ASCII) + hex;
        fcs := TFCSUtil.GetFCS(cmd);
        Result := cmd + fcs + END_CODE;
    end;
    
    { 组装 Word 读命令 }
    class function TFINS.BuildReadWordCommand(uno: Integer; area: string; channel: Integer; num: Integer): string;
    var
        cmd: string;
        fcs: string;
    begin
        cmd := HEAD_CODE + IntToHex(uno, BYTE_PER_ASCII) + PC_CODE + HEAD_BODY + READ_CMD + area + IntToHex(channel, WORD_PER_ASCII) + DEFAULT_BIT + IntToHex(num, WORD_PER_ASCII);
        fcs := TFCSUtil.GetFCS(cmd);
        Result := cmd + fcs + END_CODE;
    end;
    
    { 组装 Word 写命令 }
    class function TFINS.BuildWriteWordCommand(uno: Integer; area: string; channel: Integer; num: Integer; data: array of Integer): string;
    var
        cmd: string;
        fcs: string;
    begin
        cmd := HEAD_CODE + IntToHex(uno, BYTE_PER_ASCII) + PC_CODE + HEAD_BODY + WRITE_CMD + area + IntToHex(channel, WORD_PER_ASCII) + DEFAULT_BIT + IntToHex(num, WORD_PER_ASCII) + TFCSUtil.IntArrToHexStr(data);
        fcs := TFCSUtil.GetFCS(cmd);
        Result := cmd + fcs + END_CODE;
    end;
    
    { 组装 Word 写命令 }
    class function TFINS.BuildWriteWordCommand(uno: Integer; area: string; channel: Integer; num: Integer; hex: string): string;
    var
        cmd: string;
        fcs: string;
    begin
        cmd := HEAD_CODE + IntToHex(uno, BYTE_PER_ASCII) + PC_CODE + HEAD_BODY + WRITE_CMD + area + IntToHex(channel, WORD_PER_ASCII) + DEFAULT_BIT + IntToHex(num, WORD_PER_ASCII) + hex;
        fcs := TFCSUtil.GetFCS(cmd);
        Result := cmd + fcs + END_CODE;
    end;
    
    ////////////////////////////////////////////////////////////////////////////////
    
    class function TFCSUtil.IntArrToHexStr(data: array of Integer): string;
    var
        i: Integer;
        tmpStr: string;
    begin
        tmpStr := '';
        for i := 0 to Length(data) do begin
            tmpStr := tmpStr + IntToHex(data[i], WORD_PER_ASCII);
        end;
        Result := tmpStr;
    end;
    
    class function TFCSUtil.GetFCS(data: string; offset: Integer = 0): string;
    var
        i: Integer;
        fcs: Integer;
    begin
        fcs := 0;
        for i := 1 to (Length(data) + offset) do begin
            fcs := fcs xor ord(data[i]);
        end;
        Result := IntToHex(fcs, BYTE_PER_ASCII);
    end;
    
    class function TFCSUtil.CheckFCS(data: string): Boolean;
    var
        len: Integer;
        fcs: string;
    begin
        len := Length(data);
        if len < 22 then begin
            Result := False;
            Exit;
        end;
        if '@' <> data[1] then begin
            Result := False;
            Exit;
        end;
        if ('*' <> data[len - 1]) or (Chr(13) <> data[len]) then begin
            Result := False;
            Exit;
        end;
        fcs := TFCSUtil.GetFCS(data, -4);
        Result := fcs = data[len - 3] + data[len - 2];
    end;
    
    end.
    
    
    
  • 相关阅读:
    2019 Multi-University Training Contest 4
    AC自动机
    trie
    Contest1802
    蓝桥杯-某电视台举办了低碳生活大奖赛
    蓝桥杯-有一群海盗(不多于20人),在船上比拼酒量
    蓝桥杯-福尔摩斯到某古堡探险
    蓝桥杯-标题:字符串比较
    蓝桥杯-题目:猜算式
    蓝桥杯-标题:算年龄
  • 原文地址:https://www.cnblogs.com/zhuzhongxing/p/14147083.html
Copyright © 2011-2022 走看看