CODESYS I/O 驱动程序是在设备树中配置每个现场总线设备的技术基础。
I/O 驱动程序是连接现场总线栈、IEC 应用程序和CODESYS IDE 的纽带。驱动程序根据设备配置数据配置现场总线栈。它显示诊断结果,为 IEC 应用程序提供 API,并负责 I/O 映射(参见 "I/O 映射 "一章)。
本章简要介绍CODESYS I/O 驱动设备的基本功能,不讨论具体总线系统的细节。此外,还提供了一些配置建议。
总线周期任务
总线周期任务是 IEC 任务,I/O 驱动程序在其上下文中执行。有些 I/O 驱动程序使用多个任务:通常是一个实时关键任务(高优先级),用于传输 I/O 数据,另一个低优先级任务用于评估诊断和执行总线系统的非循环服务等任务。
对于实时关键总线系统,必须确保在该总线任务的上下文中不执行任何会因执行时间而中断总线时钟的操作。
总线任务可在 I/O 驱动设备的 I/O 映射对话框中进行配置。请注意,默认情况下会继承父设备的设置。如果该设备是 PLC,则其 PLC 设置适用于总线循环任务。




注意

如果未设置上述设置,则使用周期时间最短的任务。这样,非实时 I/O 驱动程序就可能在实时关键驱动程序的任务上下文中被无意执行,从而中断其通信。要诊断这些通信问题,建议检查任务监控。
输入/输出映射
CODESYS I/O 驱动程序的一个基本功能是更新 I/O 映射。这意味着将总线系统的 I/O 数据映射到 IEC 应用程序的变量(反之亦然)。
输入/输出数据通过双向复制和转换操作,从总线系统的内部存储器映像循环映射到分配给 %I 和 %Q 地址的 IEC 变量。
对于 I/O 驱动程序来说,无论是使用符号名称还是 "直接 "访问 %I 和 %Q 地址,在 I/O 映射方面都没有内部区别。为保证应用程序的可维护性,建议始终使用描述性变量名(例如:变量 "TemperatureReactor",而不是"%IW117")。
I/O 映射的更新可通过“总是更新变量” 进行设置(在“PLC 设置” 中进行全局设置,或在 I/O 映射对话框中为每个设备单独设置):
-
残疾:
只映射应用程序中使用的 I/O 数据。
这样可以避免复制操作,从而提高性能,但如果不更新 I/O 映射对话框中的 I/O 数据(这些值会显示为灰色),则可能会造成混乱。建议已完成开发的申请采用此设置。
-
已启用 1:
所有数据均已更新。
-
已启用 2:
注意事项仅在特殊情况下用于生产。
因此,可能会出现 I/O 数据不一致的情况,因为总线周期任务会读取/写入这些数据,而应用代码会在其他任务中使用这些数据。
参见 "I/O 数据的一致性"。
输入/输出数据的一致性
CODESYS 编程系统允许 IEC 应用程序使用并行执行的多个任务(用于可视化、现场总线或其他 POU)。应用程序代码可通过映射的 IEC 变量从这些任务的上下文中访问 I/O 数据。通过不同的任务访问相同的数据,可能会出现数据不一致或损坏的情况(例如,由于写入访问中断)。
I/O 驱动程序通过为执行任务周期的每个任务提供所使用的所有 I/O 数据的一致映射(可以说是快照)来确保数据的一致性。
因此,下面示例中的代码不会造成问题:(注意 "除以零")。
IF(inputData <> 0) THEN // inputData is mapped to %I x := y / inputData; // This will never result in DIV_BY_ZERO Exception END_IF // inputData is not updated by bus cycle during execution of POU




注意

当“始终更新变量” 选项设置为“启用 2 - 始终在总线周期任务” 时,该机制被覆盖。因此,应用程序代码必须考虑到这一点。
服务
除基本功能外,一些 I/O 驱动程序还提供可从CODESYS IDE 调用的服务,如设备扫描功能或设备地址设置。
通用建议
设置
-
“PLC 设置” :
停止 I/O 更新:
即使应用程序停止运行,例如应用程序处于调试断点时,总线周期仍会继续。这样,就能保持与现场设备的通信,并能立即不间断地继续通信。
-
“PLC 设置” :“始终更新变量” 设置为“启用 1 - 如果未在任何任务中使用,则使用总线循环任务” :
在开发应用程序期间,查看所有 I/O 数据的值非常有用。
任务配置:
-
特别是对于实时性至关重要的现场总线系统,如 Profinet、EtherCAT 或 CAN(这些系统依赖于保持精确的发送/接收时钟),建议使用具有高优先级的单独总线周期任务。对于实时性要求不高的任务(如可视化),应选择比总线周期任务低得多的优先级。
-
为了以尽可能小的偏移量实现最大的 I/O 吞吐量,可以在现场总线系统的总线任务中执行单独的 POU。但是,这些功能必须满足实时要求:例如,不得执行文件访问或阻塞套接字功能,而只能执行输出数据的计算。
多个 I/O 驱动程序和任务(故障排除)
如果必须同步多个任务(可能是多个 I/O 驱动程序实例)对 I/O 数据的一致访问,那么在某些情况下,总线和应用任务之间可能会出现不希望出现的相互干扰。
例如,当一般系统负载较高,或在同一任务中实时关键现场总线系统的 I/O 数据与慢速阻塞本地总线系统的 I/O 数据同时使用时,就会出现这种情况。
如果通信受到意外干扰,尤其是对实时性要求较高的现场总线(EtherCAT、Profinet、CAN),则应首先检查任务监控是否存在较大的抖动或周期时间异常值(与平均值相比的最大值)。任务列表提供了在不同任务中使用 I/O 数据的详细信息。
可以避免在同一任务中使用来自不同总线系统的 I/O 数据,或减少 I/O 任务的数量。