控制器与控制数据的通信交互
控制器将通信任务与应用程序代码分开运行。控制器异步运行通信和应用。因此,必须确保在应用程序执行新接收的数据前,发送至控制器的通信数据已完成传输。这适用于进入控制器的数据和流出控制器的数据。
例如,如果 HMI 设备向控制器中写入大块配方数据,应用代码可能会在数据完全写入前即开始执行该数据。这会导致应用空间中存在一半当前配方和一半上个配方。
可使用下列方法控制异步通信的影响。阻断访问有助于防止应用程序执行期间通信导致源数据值发生变化。允许访问意味着应用程序执行期间通信可能改变源数据值。
应用构建 | 标签访问 | |||||
|---|---|---|---|---|---|---|
HMI | MSG | I/O 更新 | 生产/消费 | 其他用户任务 | 运动轨迹规划 | |
UID/UIE | 允许 | 允许 | 允许 | 允许 | 阻止 | 允许 |
CPS | 阻止 | 阻止 | 阻止 | 阻止 | 允许 | 允许 |
周期性任务 | 允许 | 允许 | 允许 | 允许 | 允许 | 允许 |
这些选项取决于控制主核心何时可以切换任务。因此,当控制任务正在使用数据时,通信任务将不能对其进行更改。由于控制器通过独立的 CPU 核心处理通信,因此上述方法并非在任何情况下都有效。
由于控制器具有 32 位数据完整性,因此这仅适用于超过 32 位的数据结构。如果首要考虑的是字级完整性,则 32 位数据完整性不会影响数据使用。
良好的编程惯例是在数据开始与结尾处指定两个独特字。控制器通过验证这两个字来确保整个数据结构的完整性。建议在控制器应用代码或读取控制器数据的更高层级系统作用于握手数据之前,每次事务处理时都更改握手数据并由应用代码对其进行验证。
下表显示了添加到数据完整性检查结构中的两个数据元素:起始数据和结束数据。建议控制器在对 My_Recipe1 进行操作前,先验证起始数据值和结束数据值是否匹配。
如果不匹配,则有可能是通信正在填充该数据结构。这同样适用于从控制器接收数据的更高层级系统。
结构 | My_Recipe1 | My_Recipe2 | My_Recipe3 |
|---|---|---|---|
起始数据 | 101 | 102 | 103 |
糖 | 3 | 4 | 8 |
面粉 | 4 | 3 | 9 |
巧克力 | 2 | 2 | 4 |
油 | 6 | 7 | 2 |
结束数据 | 101 | 102 | 103 |
小贴士:
建议在数据的缓冲副本上执行本测试,而不要在通信核心写入的实际数据元素上执行。如果使用缓冲数据,则在通过数据有效性测试后能够避免通信核心对数据造成改变。
提供反馈