---
name: test-CPU

symbols:
- [Clock_Byte, MB0]
---
name: test-SC
description: 

includes: |
    FUNCTION_BLOCK "write_SC"
    TITLE='MB写命令'
    VERSION:'1.0'
    AUTHOR:Goosy
    NAME:writeB
    FAMILY:GooLib
    VAR_INPUT
        r_work_F : BOOL ;                  // 设备正常指示
        r_invalid : BOOL ;                 // 设备无效指示
        r_on_receive : BOOL ;              // 设备接收指示
        r_pause : BOOL ;                   // 设备暂停指示
        r_unit_ID : BYTE ;                 // 设备号
        r_func_code : BYTE ;               // modbus功能号
        r_length : BYTE ;                  // 接收长度
        r_B0 : BYTE ;                      // 接收字节
        r_B1 : BYTE ;                      // 接收字节 CRC_H
        r_B2 : BYTE ;                      // 接收字节 CRC_L
        r_B3 : BYTE ;                      // 保留
        w_work_F : BOOL ;                  // 设备正常指示
        w_invalid : BOOL ;                 // 设备无效指示
        w_on_receive : BOOL ;              // 设备接收指示
        w_pause : BOOL ;                   // 设备暂停指示
        w_unit_ID : BYTE ;                 // 设备号
        w_func_code : BYTE ;               // modbus功能号
        start_H : BYTE ;                   // 写起始高字节
        start_L : BYTE ;                   // 写起始低字节
        len_H : BYTE ;                     // 写数量高字节
        len_L : BYTE ;                     // 写数量低字节
        w_CRC_H : BYTE ;                   // CRC16
        w_CRC_L : BYTE ;                   // CRC16
        CH : ARRAY[1..8] OF BOOL;          // QB0 数据
        B0 AT CH : BYTE;                   // QB0 数据
    END_VAR
    VAR_OUTPUT
        bytes_count : INT := 10;           // 总字节数
        unit_ID : BYTE := B#16#4;          // 子站地址
        func_code : BYTE := B#16#F;        // modbus 功能号，15写多个线圈
        start : INT := 0;                  // 起始地址
        length : INT := 8;                 // 数据长度
        betys : BYTE := B#16#1;            // 字节数
        data : BYTE := B#16#0;             // 数据
        CRC_H : BYTE ;                     // CRC16
        CRC_L : BYTE ;                     // CRC16
    END_VAR
    VAR_IN_OUT
        writing : BOOL;                    //正在写
    END_VAR
    BEGIN
    IF B0 <> r_B0 THEN
        data := B0;
        writing := TRUE;
    END_IF;
    END_FUNCTION_BLOCK

    DATA_BLOCK "EDO02" "write_SC"
    BEGIN
    END_DATA_BLOCK

    // 设备数据接收DB块，可根据设备定义多个接收DB块
    // 本例"rdata_SC"的DB号为53，在其中定义了4个设备的数据，依据实际增减
    // 建议一个设备只定义在一个DB中，本例一个DB定义多个设备仅为了展示可以这样组织
    DATA_BLOCK "rdata_SC"
    STRUCT
        device0_workOK : BOOL;                 // 设备正常指示 0
        device0_error : BOOL;                  // 设备错误指示
        device0_on_receive : BOOL;             // 设备接收指示
        device0_pause : BOOL ;                 // 设备暂停指示
        device0_deviceID : BYTE;               // 设备号
        device0_funcNo : BYTE;                 // modbus功能号
        device0_len : BYTE;                    // 长度
        device0_data : ARRAY[4..31] OF BYTE;   // 数值
        device1_workOK : BOOL;                 // 设备正常指示 1
        device1_error : BOOL;                  // 设备错误指示
        device1_on_receive : BOOL;             // 设备接收指示
        device1_pause : BOOL ;                 // 设备暂停指示
        device1_deviceID : BYTE;               // 设备号
        device1_funcNo : BYTE;                 // modbus功能号
        device1_len : BYTE;                    // 长度
        device1_data : ARRAY[36..63] OF BYTE;  // 数值
        device2_workOK : BOOL;                 // 设备正常指示
        device2_error : BOOL;                  // 设备错误指示
        device2_on_receive : BOOL;             // 设备接收指示
        device2_pause : BOOL ;                 // 设备暂停指示
        device2_deviceID : BYTE;               // 设备号
        device2_funcNo : BYTE;                 // modbus功能号
        device2_len : BYTE;                    // 长度
        device2_data : ARRAY[68..95] OF BYTE;  // 数值
        device3_workOK : BOOL;                 // 设备正常指示
        device3_error : BOOL;                  // 设备错误指示
        device3_on_receive : BOOL;             // 设备接收指示
        device3_pause : BOOL ;                 // 设备暂停指示
        device3_data0 : BYTE;
        device3_data : ARRAY[98..127] OF BYTE; // 数值
        device4_workOK : BOOL;                 // 设备正常指示 30
        device4_error : BOOL;                  // 设备错误指示
        device4_on_receive : BOOL;             // 设备接收指示
        device4_pause : BOOL ;                 // 设备暂停指示
        device4_data0 : BYTE;
        device4_data : ARRAY[130..159] OF BYTE; // 数值
    END_STRUCT;
    BEGIN
    END_DATA_BLOCK

symbols:
- [SC_polls_DB, DB880]
- [CRC16, FC16, ~, modbus CRC16 校验]
- [write_SC, FB813]
- [rdata_SC, DB53]
- [EDO02, DB32, write_SC]

list : # CP 模块列表
- comment: CP01 256
  type: CP341
  module_addr: 256
  DB: [CP01, DB10]
  polls:
  - comment: 第1个poll modbus协议
    mode: continuous # 连续模式。可省略，默认模式
    unit_ID: 1       # 有该参数时，表示该poll为modbus协议
    func_code: 3
    address: 0
    length: 12
    # 配置项允许16进制字符串
    recv_DB: rdata_SC
    recv_start: 0
  - comment: 第2个poll 周期发送
    mode: periodicity  # 周期模式
    timeout: 1000 # 指定同期，单位ms，默认 2000ms
    unit_ID: 2
    func_code: 4
    address: 0
    length: 12
    recv_DB: rdata_SC
    recv_start: 32                     # 要注意开始地址不一样
  - comment: 第3个poll 指定发送数据
    mode: custom # 指定为自定义模式，由用户控制发送
    is_modbus: true # 指定为modbus协议，有 send_data 参数时默认为非modbus协议
    send_data: 03 03 00 00 00 0C 00 00    # send_data 必须是一个由空格分隔的16进制字节的字符串
    recv_DB: rdata_SC
    recv_start: 64                     # 要注意开始地址不一样
    extra_code: |- # 通过设置 request 来控制发送
      "SC_polls_DB".CP01[2].request := "Clock_1Hz";
  - comment: 第4个poll 读取线圈
    unit_ID: 4
    func_code: 1
    address: 0
    length: 8
    recv_DB: EDO02
    recv_start: 0
  - comment: 第5个poll 指定外部发送块
    mode: custom
    send_DB: EDO02
    send_start: 20
    recv_DB: EDO02
    recv_start: 8                     # 要注意开始地址不一样
    extra_code: |- # 通过设置 custom_trigger 来控制发送
      "write_SC"."EDO02"(writing := "SC_polls_DB".CP01[4].custom_trigger);
...
