# plugin_s7_plc **Repository Path**: wasome/plugin_s7_plc ## Basic Information - **Project Name**: plugin_s7_plc - **Description**: WA-IOT-EDGE plugin for S7 200/300/400 PLC. - **Primary Language**: C - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-06-20 - **Last Updated**: 2024-11-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Siemens S7 PLC plugin **注意**: 1. 本项目用于展示开发WA-IOT-EDGE的插件,不能保证达到用于生产环境的条件。用户在使用时,必须确保安全的操作环境!!! 2. 需要使用2024-05-26以后的`WA-IOT-EDGE-SDK `版本。 ## 一、准备材料 Ⅰ、S7-200PLC及其配件: 1. S7-200 PLC CPU(CPU 222 CN)×1 2. 220V AC电源线×1 3. RS485转USB电缆×1 4. ETH-PPI以太网转换器模块 Ⅱ、S7-300PLC及其配件: 1. S7-300 PLC CPU(CPU 314)×1 2. 220V AC电源线×1 3. 24V DC电源线×1 4. 220V AC转24V DC电源模块(PS307)×1 5. 数字量输出模块(SM322)×1 6. ETH-MPI/DP以太网转换器模块(Socket)×1 7. RJ45交叉网线×1 8. RS485转USB电缆×1 9. RS485公母线×1 ## 二、连线图 Ⅰ、S7-200PLC连线图 1. S7-200与网关串口方式连接网关 ![](./doc/s7_200.png) 当S7-PLC设备接入网关后,需要查看设备的串口号和串口的可读写可执行属性: 1. ll /dev/ttyUSB\* 查看串口号以及属性 2. sudo chmod 777 ttyUSB\* 修改串口的可读写与可执行属性,变为可读写、可执行(rwx)。 Ⅱ、S7-300PLC连线图 1. 模块组合连接图 ![](./doc/s7_300.png) 1. S7-300与网关串口方式连接网关(如S7-200图) 2. S7-300与网关网口方式连接网关 ![](./doc/s7_300_conn.png) 4. ETH-MPI/DP模块设置 模块IP默认为192.168.1.10(默认),port为258(默认),模块可以再IE上修改其IP地址、速率等属性,IE地址为192.168.1.222。(百度搜索ETH-MPI/DP使用说明有具体使用方法)s7-300通过网口连接网关使用ISOTCP协议。 ## 三、提示 1. 如果需要在使用一般用户权限时进行调试和测试,查看设备的串口号和串口的可读写可执行属性: - ll /dev/ttyUSB\* 查看串口号以及属性 - sudo chmod 777 ttyUSB\* 修改串口的可读写与可执行属性,变为可读、可执行(rwx)。 2. Linux系统可能会存在下发成功但收不到设备回复的问题,此时需要在nodave.c中\_daveExchangePPI()函数中加延时。 ## 四、接口 URL: /s7?DI=[uuid]&ITEMS=[items]&area=[daveDB]&an=[area number]&addr=[address]&type=[data type] ### PUT: Payload: [1, 1, 2] 或者: 1 ### GET: Response example: Payload: [1, 1, 2] 数组个数为{ITEMS} **字段说明:** | **字段** | **类型与有效值** | **必选** | **说明** | | --- | --- | --- | --- | | DI | | 是 | 设备id | | ITEMS | 整形 | 否(缺省1) | 操作条目数, GET时有效,PUT由payload的JSON ARRAY来决定| | area | | 是 | PLC寄存器区域 | | an | | 是 | 区域编号,只有DB块时有值,其余默认为0 | | addr | | 是 | 读写寄存器起始地址 | | type | | 是 | 数据读写类型 | | value | 整形 | 是 | 写入资源值 | type: ``` "bits", "bytes", "s8int", "words", "s16int", "dwords", "s32int", "float" ``` area: - db, flags, inputs, outputs, timer, counter - p, sysinfo, sysflag, ai, ao 其他: - davaAnaOut 、daveAnaIn、daveP区域支持bytes(字节)、words(字)、dwords(双字)、s16int(有符号16位整形)、s32int(有符号32位整形)、float(32位浮点型)类型数据输入。 - daveFlags区域支持words(字)、dwords(双字)、float(32位浮点型)类型数据输入。 - daveDB、daveInputs、davaOutputs区域支持bits(位)、bytes(字节)、words(字)、dwords(双字)、s16int(有符号16位整形)、s32int(有符号32位整形)、float(32位浮点型)类型数据输入。 - 其它区域区域支持bits(位)、bytes(字节)、words(字)、dwords(双字)、s16int(有符号16位整形)、s32int(有符号32位整形)、float(32位浮点型)类型数据输入。 - daveDB、daveInputs、daveOutputs区域支持bits(位)、bytes(字节)、words(字)、dwords(双字)、s8int(有符号8位)、s16int(有符号16位整形)、s32int(有符号32位整形)、float(32位浮点型)类型数据输出。 - 其他区域除了不支持bit(位)输出,其它类型都支持 - 代码中只给出了daveOutputs区的输出,其他区域//todo,输出方式及计算方法与daveOutputs类似,需根据实际案例需求编写。 - 不同的数据类型对应的数据长度len不同: - bits-1、bytes-小于16、s8int-小于16、words-小于16、s16int-小于16、dwords-小于16、s32int-小于16、float-小于16(小于最大寄存器个数,s7-200 output区为16个寄存器,s7-300为128个寄存器)。 PLC寄存器区域参考: ![](./doc/s7_memory.png) ## 五、配置文件格式 在插件配置的标准之上增加了定制化的配置: ``` "custom_fields": { "protocol":"PPI|MPI|MPI2|MPI3|MPI4|ISOTCP|ISOTCP243", "speed":"9k|19k|187k|500k|1500k|45k|93K", "localMPI":0, "mpi_addr":2, "rack": 0, "slot":2 } ``` 定义格式如下: | **字段** | **类型与有效值** | **必选** | **说明** | | --- | --- | --- | --- | | uuid | 字符串 | 是 | 设备唯一标识符 | | name | 字符串 | 否 | 设备名称 | | protocol | 字符串 | 是 | 设备通讯协议,目前支持上表中7种协议,根据设备选择。 | | speed | 字符串 | 是 | 通讯速度参数,根据实际设备选择。 | | localMPI | 整形 | 是 | 上位机地址,默认为0。(PPI协议此参数不重要,为默认值0) | | mpi\_addr | 整形 | 是 | 设备默认地址,默认为2。。(PPI协议此参数不重要,为默认值2) | | bus\_ip | JSON对象 | 根据设备接入方式选择,如果是TCP则必选 | | rack | 整形 | 是 | 机架号,默认为0(PPI协议为0) | | slot | 整形 | 是 | cpu编号,默认为2(PPI协议为0) |