关于USS_Port_Scan,和USS_Drive_Control
通常做项目的时候没有仔细注意过,一般情况下没有注意过。
因为复习,查看示例程序。才注意到这里面先调用USS_Drive_Control 后调用USS_Port_Scan

这个和s7-200的uss子程序的调用有所不同
s7-200 所使用的USS_CTRL 与s7-1200的USS_Drive_Control对应,
如果只是照推断,s7-200:USS_INIT应该与s7-1200:USS_Port_Scan对应
但这两个函数无法做到对应,USS_INIT只需要初始化时调用就可以了,但USS_Port_Scan需要实时调用,在示例程序中也是这样。博图帮助文档也是这么描述的

图来源:帮助文档:\信息系统\对PLC进行编程\指令\指令(S7-1200,S7-1500)\通信(S7-1200,S7-1500)\通信处理器(S7-1200,S7-1500)\USS(S7-1200,S7-1500)\USS_Port_Scan / USS_Port_Scan_31
通过这些描述可以猜测,S7-200的USS通信与S7-1200的USS通信机制上略有不同。
主要区别大致在于:S7-200的USS通信的串口数据发送是在执行USS_CTRL这类指令时进行的,之后等待反馈报文,而S7-1200的USS通信的串口数据发送应该是在执行USS_Port_Scan指令时进行的,而不是USS_Drive_Control 。
想要验证,需要简单查看下USS_Drive_Control 和USS_Port_Scan的FB块内容,尽管因为保密原因,无法直接查看到其中的程序,但是只查看静态变量,也可以知道很多信息。
USS_Drive_Control

P2P_USS2_BASE变量内部没有串口通信FB块的多重背景数据块。
可以确认
USS_Drive_Control这个看似很大的驱动程序并不负责通信事物本身。
再看下 USS_Port_Scan


在这里找到了一批串口通信用多重背景数据块,很明显,通信功能是在这个程序内实现的。
那这里面机制就大致清楚了。
每次调用USS_Drive_Control时并不会直接进行通讯,它会完成通讯反馈,并把控制指令缓存到一批缓存区内(USS_DB)。
而只有调用 USS_Port_Scan时,才根据缓存区内数据整理数据,再通过串口,发送到V20。
猜测 USS_Read_Param和USS_Write_Param也使用相同机制,不过它们没有背景数据块,所使用的缓存区是USS_Drive_Control的缓存区。