zhang2601312
级别: 探索解密
精华主题: 0
发帖数量: 24 个
工控威望: 125 点
下载积分: 664 分
在线时间: 20(小时)
注册时间: 2016-08-16
最后登录: 2025-06-21
查看zhang2601312的 主题 / 回贴
楼主  发表于: 10天前
图片:
图片:
图片:
图片:
图片:
图片:
图片:
用的用户自由通讯发送和接收功能块。发送功能块对下发送了一个读取报文(01 03 00 12 00 04 EC 0C)然后就出现了一个问题。就发送这个报文读取4个字节数据时接收的数据是没问题的。但是我想多读取几个数据发送(01 03 00 12 00 10 EC 03)的话接收到的报文就和图片1一样乱的。这是为啥呢。问了论坛好多高手的意思估计是接收功能块设置问题。但是我仔细看了帮助几个模式(ADHOC设置位1或者0)都测试过了还是没用。求助各位高手帮忙看下。十分感谢。PS:报文没问题
zhang2601312
级别: 探索解密
精华主题: 0
发帖数量: 24 个
工控威望: 125 点
下载积分: 664 分
在线时间: 20(小时)
注册时间: 2016-08-16
最后登录: 2025-06-21
查看zhang2601312的 主题 / 回贴
1楼  发表于: 10天前
有大神帮我看下吗?谢谢了
世界杯之殇
级别: 探索解密
精华主题: 0
发帖数量: 51 个
工控威望: 117 点
下载积分: 5901 分
在线时间: 59(小时)
注册时间: 2023-09-25
最后登录: 2025-06-20
查看世界杯之殇的 主题 / 回贴
2楼  发表于: 10天前
大佬,球球你按一下F1,然后根据范例来写吧!
你现在有事modbus rtu ,后面又是自由口,混着用的吗?
tsend_c的req直接改为1
楼主留言:
大佬不是啊,我这个报文是发送到下面一个串口服务器上面去了。串口服务器对上和PLC是TCP通讯。对下的传感器是RTU通讯。串口服务器起一个RTU转TCP的作用。
zhang2601312
级别: 探索解密
精华主题: 0
发帖数量: 24 个
工控威望: 125 点
下载积分: 664 分
在线时间: 20(小时)
注册时间: 2016-08-16
最后登录: 2025-06-21
查看zhang2601312的 主题 / 回贴
3楼  发表于: 10天前
各位大佬问题已解决。是接收块LEN填写的数值和接收DB块的长度问题。谢谢各位大佬的关心。3Q3Q
http200
级别: 正式会员
精华主题: 0
发帖数量: 13 个
工控威望: 57 点
下载积分: 99 分
在线时间: 5(小时)
注册时间: 2024-12-23
最后登录: 2025-06-21
查看http200的 主题 / 回贴
4楼  发表于: 7天前
开放式tcp乱序是因为发送字节数和接收字节数对不上,不足接收字节数的就会被plc先缓存起来
楼主留言:
对的对的,接收区的字节数设置少了,然后数据存储位不够的话就会从头开始。所以看起来就像乱了一样
http200
级别: 正式会员
精华主题: 0
发帖数量: 13 个
工控威望: 57 点
下载积分: 99 分
在线时间: 5(小时)
注册时间: 2024-12-23
最后登录: 2025-06-21
查看http200的 主题 / 回贴
5楼  发表于: 7天前
前几天测试开放式tcp也遇到一样的问题,问deepseek和chatgpt解决的
楼主留言:
我也查了deepseek但是没给有用的答复,可能是我的问题没阐述清楚
http200
级别: 正式会员
精华主题: 0
发帖数量: 13 个
工控威望: 57 点
下载积分: 99 分
在线时间: 5(小时)
注册时间: 2024-12-23
最后登录: 2025-06-21
查看http200的 主题 / 回贴
6楼  发表于: 7天前
您遇到的数据顺序错乱问题是由于**TCP协议本身的无边界性和PLC缓冲区处理机制**共同导致的。以下是具体原因和解决方案:

---

### **问题根源分析**
1. **TCP流式协议特性**  
   TCP是字节流协议,不保证应用层消息的边界。若客户端快速连续发送多组数据,PLC可能将多次发送的数据合并到同一接收缓冲区(如网络延迟或PLC处理速度慢时)。

2. **PLC缓冲区覆盖机制**  
   S7-1200的`TRCV`指令默认采用**循环缓冲区**(FIFO机制)。当新数据到达时,会从缓冲区的当前指针位置开始覆盖旧数据,导致看似"乱序"。

3. **字节对齐差异**  
   如果客户端发送时未显式指定字节序(如大端/小端),而PLC默认按大端序解析,可能引发分段错误(但您的案例中实际是整体偏移,非字节反转)。

---

### **解决方案**
#### **(1) 显式定义应用层协议**
在数据包中加入**帧头**和**帧尾**标识,例如:
```plaintext
[头标识:0xAA][数据长度:1字节][数据:N字节][校验和:1字节][尾标识:0x55]
```
PLC侧通过循环检查缓冲区匹配完整帧后再处理。

#### **(2) 修改TRCV参数配置**
```pascal
TRCV(
    REQ     := TRUE,        // 持续使能
    CONT    := TRUE,        // 保持连接
    DATA    := #ReceiveBuf, // 接收缓冲区
    LEN     := 20,          // 预期接收长度
    RCVD_LEN=> #ActualLen,  // 实际接收长度输出
    BUSY    => #BusyFlag);
```
关键点:
- 设置`LEN`与发送方严格一致(您已设为20字节)。
- 监控`RCVD_LEN`确认每次接收的实际字节数。

#### **(3) 强制单次接收同步**
在客户端每次发送后增加延迟(如100ms),或通过PLC程序控制:
```pascal
IF #FirstReceive THEN
    TRCV(REQ := TRUE);      // 首次触发
    #FirstReceive := FALSE;
ELSE
    TRCV(REQ := NOT #BusyFlag); // 上次接收完成后再请求
END_IF;
```

#### **(4) 使用`TRCV_C`替代`TRCV`**
`TRCV_C`集成连接管理,可减少缓冲区冲突:
```pascal
TRCV_C(
    CONT    := TRUE,
    LEN     := 20,
    DATA    := #ReceiveBuf,
    RCVD_LEN=> #ActualLen);
```

---

### **您的数据案例分析**
- **原始发送数据**(16进制):
  ```plaintext
  15 3E 14 24 54 26 4E 28 51 29 53 AA 56 B0 2D 2D 5C 75 2F C8
  ```
- **PLC接收数据**:
  ```plaintext
  2D 2D 5C 75 2F C8 15 3E 14 24 54 26 4E 28 51 29 53 AA 56 B0
  ```
  **现象解释**:  
  数据被**环形偏移6字节**,说明PLC缓冲区中残留了之前未及时读取的6字节数据,新数据从缓冲区第7字节开始写入,形成"拼接"效果。

---

### **终极调试建议**
1. **清空缓冲区**  
   在建立连接后、首次接收前,调用`TRCV`连续读取直到`BUSY`=FALSE,丢弃旧数据。

2. **Wireshark抓包验证**  
   过滤PLC的IP和端口,确认客户端是否真正按预期顺序发送(排除调试助手本身问题)。

3. **PLC侧诊断**  
   在线监视`TRCV`的`RCVD_LEN`和`STATUS`,正常时应返回`16#7000`(无错误)。

4. **代码示例(清空缓冲区)**  
```pascal
// 初始化阶段清空缓冲区
#TempBuffer := ARRAY[1..100] OF BYTE; // 临时缓冲区
WHILE TRUE DO
    TRCV(
        REQ  := TRUE,
        DATA := #TempBuffer,
        LEN  := 100,
        BUSY => #IsBusy);
    IF NOT #IsBusy THEN EXIT; END_IF;
END_WHILE;
```

---

通过以上方法,您应该能解决数据错序问题。如果仍有异常,请检查:
- 客户端是否启用了Nagle算法(建议禁用)
- PLC的OB1循环时间是否过短(建议≥50ms)
- 是否有多余的`TRCV`调用覆盖了缓冲区
楼主留言:
谢谢回复解答
吾志所向
级别: 家园常客
精华主题: 0
发帖数量: 382 个
工控威望: 666 点
下载积分: 1934 分
在线时间: 169(小时)
注册时间: 2016-12-10
最后登录: 2025-06-21
查看吾志所向的 主题 / 回贴
7楼  发表于: 昨天
有不用编程的方案的,不用编写通讯程序,可以节省时间来专心处理工艺流程代码,
图文案例:https://blog.csdn.net/AutoCtrl/article/details/124242478?spm=1001.2014.3001.5502
资料文件: PLC与其它设备之间通讯.rar (4854 K) 下载次数:4