7. 配置模块及自定义模块
7.1.1 PN设备的基本模型
初次接触PN的开发者,最容易出现的错误就是设备的实际配置与TIA的组态不一致。为了开发的过程更加顺利,非常有必要掌握PN设备的基础模型。PN设备的基本模型如下图描述:
PN设备的基本构成是插槽slot,所有的设备均是由一个或多个插槽组成,每个插槽均由若干子插槽sub-slot组成。其中插槽0固定作为总线接口,也叫做设备访问点(DAP-device access point)。插槽1及之后的插槽(2 …) 作为输入输出,提供周期数据访问或非周期数据访问以及报警、诊断功能。在GSDML文件中,描述了每个槽上可用的模块,以及每个模块包含的可用子模块。在组态软件(TIA博图)中根据实际的设备配置,将模块、子模块分配到槽和子槽。
注意,这里的组态的配置必须与设备实际的配置相同。如果组态的配置与设备实际的配置的不相同,如下图所示,PLC不会建立与设备的控制关系(IOC-AR)
同时,PLC会为每个模块、子模块的IO数据在过程映像区内分配对应的地址。输入数据对应I过程映像区, 输出数据对应Q映像区。基于PN通讯,PLC通过指定的OB块(例如:OB0、OB30或OB61),将从PN设备接收的输入数据更新到I区,以及将Q区的数据发送至PN设备建立输出。PLC应用程序在OB块内通过地址访问过程映像区,处理输入设置输出。
7.1.2 协议栈中的模块配置
用户程序可以通过PNIO_sub_plug()在设备中添加一个模块,也通过PNIO_sub_plug_list设备中添加多个模块。以APP1参考代码为例,协议栈按照如下方式初始化设备的实际配置:
然后再初始化过程中,通过调用PNIO_sub_plug_list完成IO设备的实际配置:
这样就完成如下图的设备配置:
其中Slot1、Sub-slot1为64bytes 的输入模块,模块MOD-ID=0x30、子模块SUBMOD-ID=0x01; Slot2、Sub-slot1为64bytes 的输出模块,模块MOD-ID=0x31、子模块SUBMOD-ID=0x01。
参考第2章,如果PLC需要与设备建立控制关系,在组态过程中就需要按照下图所示与实际设备的配置一致。
按照第2章的内容建立环境,以及对PLC进行组态。将协议栈的初始化配置列表改为如下形式:
即从配置中移除64bytes 的输出模块,如下图所示:
如果PLC的组态保留原有配置,在串口的打印信息中可以看到:
由于组态配置与实际插入模块不符,可以通过打印信息看到isWrong=1。同时,PLC的故障灯亮起,从PLC的诊断信息可以看出,Slot2 Subslot1 的子模块出现错误信息:
200P协议栈支持动态添加模块,通过API PNIO_sub_plug 可动态的添加模块、子模块到对应的插槽和子插槽上。在App1中可以通过输入‘S’调用PNIO_sub_plug添加模块“64bytes output” 到slot2 subslot1。终端的显示信息如下:
由于添加模块后,设备的配置与TIA中的组态一致,可以看到PLC恢复正常工作:
在某些情况下我们需要设备自动的适配TIA的组态,例如slot2 subslot1初始化为“64bytes output”
但是我们在TIA的组态中配置为“1byte out”
可以通过自动适配模块的方式将设备的配置自动替换为与PLC的组态一致的模块。具体方法如下:
PLC的发送连接请求到设备时,会触发PNIO_cbf_ar_ownership_ind回调函数,在回调函数中如果发现PLC组态与模块不一致,首先调用PNIO_sub_pull移除原有的模块(64bytes output),然后调用PNIO_sub_plug添加新的模块(1byte out)。代码片段如下
编译后运行,可以看到设备已经自动适配到PLC的组态。