西门子S7协议网关
前言
- 支持单数据读写,多数据读写,大数据量自动分包读写
- 支持序列化批量多地址且地址不连续的读写
- 支持读写DB区,I区,Q区,M区,V区
- 支持读写西门子S1500,S1200,S400,S300,S200Smart,西门子机床828D
- 支持PLC自动重连
如:对于200smartPLC的V区,就是DB1.X,例如,V1=DB1.1,V100=DB1.100
知识点
知识点1:地址的格式以及对应含义,兼容大小写
简写 | 区域 | 字节索引 | 位索引 | PLC类型 |
---|---|---|---|---|
DB1.1.2 | DB1区 | 1 | 2 | S1200/S1500 |
DB2 | DB2区 | 0 | 0 | S1200/S1500 |
DB3.3 | DB3区 | 3 | 0 | S1200/S1500 |
D1.1.2 | DB1区 | 1 | 2 | S1200/S1500 |
Q1.6 | Q区 | 1 | 6 | S1200/S1500 |
Q1 | Q区 | 1 | 0 | S1200/S1500 |
I2.5 | I区 | 2 | 5 | S1200/S1500 |
I2 | I区 | 2 | 0 | S1200/S1500 |
M3.2 | M区 | 3 | 2 | S1200/S1500 |
M3 | M区 | 3 | 0 | S1200/S1500 |
V2.1 | V区 | 2 | 1 | S200Smart |
V2 | V区 | 2 | 0 | S200Smart |
知识点2:访问数据类型与JAVA数据类型和PLC数据类型对应关系
访问数据类型 | 数据类型名称 | 数据大小[位] | 数据大小[字节] | JAVA数据类型 | PLC数据类型 | 示例 |
---|---|---|---|---|---|---|
boolean | 布尔类型 | 1 | 1/8 | Boolean | BOOL | true |
byte | 字节类型 | 8 | 1 | Byte | BYTE | 0x11 |
uint16 | 无符号2字节整型 | 16 | 2 | Integer | WORD/UINT | 65535 |
int16 | 有符号2字节整型 | 16 | 2 | Short | WORD/INT | -32760 |
uint32 | 无符号4字节整型 | 32 | 4 | Long | DWORD/UDINT | 70000 |
int32 | 有符号4字节整型 | 32 | 4 | Integer | DWORD/DINT | -70000 |
float32 | 4字节浮点型 | 32 | 4 | Float | REAL | 3.14 |
float64 | 8字节浮点型 | 64 | 8 | Double | LREAL | 3.14 |
string | 字符型 | 8 | 1 | String | String | ABC |
time | 时间/耗时 | 32 | 4 | Long | Time | 100ms |
date | 日期 | 16 | 2 | LocalDate | Date | 2023-04-03 |
timeOfDay | 一天中的时间 | 32 | 4 | LocalTime | TimeOfDay | 10:22:11 |
dtl | 日期+时间 | 96 | 12 | LocalDateTime | DTL | 2023-04-03 10:22:11 |
知识点3:PLC地址与本项目地址和数据类型的对应关系
PLC地址 | 位大小 | 字节大小 | 访问地址 | 访问数据类型 | PLC类型 |
---|---|---|---|---|---|
DB100.DBX0.0 | 1 | 1/8 | DB100.0.0 | boolean | S1200/S1500 |
DB100.DBB5 | 8 | 1 | DB100.5 | byte | S1200/S1500 |
DB100.DBW6 | 16 | 2 | DB100.6 | uint16/int16 | S1200/S1500 |
DB100.DBD3 | 32 | 4 | DB100.3 | uint32/int32/float32 | S1200/S1500 |
VB100 | 8 | 1 | V100 | byte | S200Smart |
VW100 | 16 | 2 | V100 | uint16/int16 | S200Smart |
VD100 | 32 | 4 | V100 | uint32/int32/float32 | S200Smart |
MB1 | 8 | 1 | M1 | byte | - |
MW1 | 16 | 2 | M1 | uint16/int16 | - |
MD1 | 32 | 4 | M1 | uint32/int32/float32 | - |
常见问题
1、为什么PLC能写入数据,但是checkConnected 却是false呢?
通信采用懒加载,读写的时候才会触发连接,将checkConnected放在write或read后就变成true。
2、在PLC关闭之后获取异常,在PLC重启之后自动连入该怎么处理?
内部支持断线重连,每次触发读写操作的时候,若PLC已经断线,则触发重连操作。
3、当反馈的报错信息为“未在模块上实现此服务或报告了帧错误”,原因是什么?
由于PLC没有该地址块数据,或者该地址数据不支持访问。
4、PLC通信过程中最大的读写数据字节大小?
PLC的网络通信,根据不同型号PLC的PDULength而定,S1200 = 240,S1500 = 960,总之有240, 480, 960。
最大读取字节数组大小是222 = 240 - 18, 462 = 480 - 18, 942 = 960 - 18。
目前PDULength默认都为240,可自行调整。
根据测试S1200[CPU 1214C],单次读多字节
发送:最大字节读取长度是 216 = 240 - 24, 24(请求报文的PDU)=10(header)+14(parameter)
接收:最大字节读取长度是 222 = 240 - 18, 18(响应报文的PDU)=12(header)+2(parameter)+4(dataItem)
根据测试S1200[CPU 1214C],单次写多字节
发送:最大字节写入长度是 212 = 240 - 28, 28(请求报文的PDU)=10(header)+14(parameter)+4(dataItem)
接收:最大字节写入长度是 225 = 240 - 15, 15(响应报文的PDU)=12(header)+2(parameter)+1(dataItem)
5、批量读写数据时,单次通信过程中,最多读写多少数据?
PDU length | 数据类型 | 字节数量 | (写)最多个数 | (读)最多个数 | PLC |
---|---|---|---|---|---|
240 | boolean / byte | 1 | 12 | 18 | S1200 / S200Smart |
240 | uint16 / int16 | 2 | 12 | 18 | S1200 / S200Smart |
240 | uint32 / int32 / float32 | 4 | 11 | 18 | S1200 / S200Smart |
240 | float64 | 8 | 9 | 17 | S1200 / S200Smart |
PDU length | 数据类型 | 字节数量 | (写)最多个数 | (读)最多个数 | PLC |
---|---|---|---|---|---|
480 | boolean / byte | 1 | 26 | 38 | S400 |
480 | uint16 / int16 | 2 | 24 | 38 | S400 |
480 | uint32 / int32 / float32 | 4 | 22 | 38 | S400 |
480 | float64 | 8 | 18 | 35 | S400 |
PDU length | 数据类型 | 字节数量 | (写)最多个数 | (读)最多个数 | PLC |
---|---|---|---|---|---|
960 | boolean / byte | 1 | 52 | 78 | S1500 |
960 | uint16 / int16 | 2 | 49 | 78 | S1500 |
960 | uint32 / int32 / float32 | 4 | 45 | 78 | S1500 |
960 | float64 | 8 | 38 | 72 | S1500 |
6、PLC初始化参数
PLC | 最大 PDU length | Rack | Slot |
---|---|---|---|
S200_SMART | 240 | 0 | 1 |
S300 | 240 | 0 | 2 |
S400 | 480 | 0 | 3 |
S1200 | 240 | 0 | 1 |
S1500 | 960 | 0 | 1 |
7、一般PLC同时在线连接数量有限,切勿重复new S7PLC()!!!