今天继续我们的小白教程,老鸟就不要在这浪费时间了。
前面一期我们以合信的控制器为例,讲了如何实现控制器设备的安装和相关模块的添加。这一期我们以合信的控制器为例,主要讲如何与实际设备没有连接,并展示一下具有IO控制功能的程序开发,让大家对控制器的使用有一个实际的感受。
一、IO模块控制编程
下面我们用这个控制器来做一个跑马灯的程序,主要是为了方便演示。在实际控制设备的过程中,实现的流程和功能跟这个程序其实差别不大。
与第一期类似,首先需要通过在“Application”上点右键选择“添加对象”添加必要的模块,即任务配置和POU,POU的名字仍然用main,类型还是选择程序。然后在“任务配置àTask”中添加对main程序的调用,添加后如下图所示:
首先定义几个BOOL量的数组,用来代表IO模块的输入输出。其中IN[0]作为跑马灯程序的启动键,IN[1]作为跑马灯程序的停止键,IN[2]表示跑马灯的定时周期为1秒,IN[3]表示跑马灯的定时周期为0.2秒。启动信号给出后对OUT定时依次进行置位和复位。停止信号给出后程序停止运行。
程序如下:
PROGRAM main //变量声明部分
VAR
IN : ARRAY[0..15] OF BOOL;
OUT : ARRAY[0..15] OF BOOL;
i : INT :=0;
j : INT;
delay : INT;
k : INT;
END_VAR
//以下为程序部分
IF IN[1] OR (NOT IN[0]) THEN //停止
i := 0;
k := 0;
FOR j:=0 TO 15 DO
OUT[j]:=FALSE;
END_FOR
RETURN;
END_IF
IF IN[2] THEN
delay := 1000; //定时时间1000ms
END_IF
IF IN[3] THEN
delay := 200; //定时时间200ms
END_IF
IF IN[0] THEN //开始执行
IF k = delay / 20 THEN //定时时间到
OUT[i] := FALSE;
i := i + 1;
IF i > 15 THEN //回到0
i := 0;
END_IF
k := 0;
END_IF
OUT[i] := TRUE;
k := k+1;
END_IF
二、IO模块配置
功能实现后,需要将内部代表IO操作的变量跟IO模块设备的端口对应起来,以保证程序中能够读到输入模块DIT_16_16DI对应端口的信号,并将输出信号送到输出模块DQR_16_16DQ对应的端口。
双击设备树中的输入模块DIT_16_16DI,在打开的窗口中选择“Internal I/O映射”,然后在右边窗口中选择Bit0对应的变量,双击下图椭圆红框中的空白处会出现“…”,点击这个省略号会弹出下图窗口。在该窗口中选择“ApplicationàmainàIN”,即前面在main程序中定义的代表输入的BOOL数组。
完成后还需要在其后增加“[0]”,表示数组的第0个BOOL量对应输入模块的第0位输入。其余的输入按照同样的方式一一对应,输入信号对应完成后如下图所示:
同样的方式可以把BOOL数组OUT对应到输出模块DQR_16_16DQ的相应端口上。
这样就完成了main程序中的IO变量与设备实际端口的对应连接。当输入端口的信号变化时,可以从IN读取。当需要改变输出时,只需要向OUT对应的位置写入状态即可。程序内更新的周期与调用main程序的任务周期一样,这里设置是20ms。
三、控制器配置及连接
1.检查网关
首先在系统托盘处确认CODESYS的网关是否已经运行,这个是CODESYS开发环境连接控制器的接口。在装CODESYS的时候该模块是默认安装的,但初始状态可能没有运行,这时候需要通过“Start Gateway”启动网关。
2.通信设置
需要将连接控制器的电脑的IP地址设置为与控制器在同一个网段。C35的IP地址段为192.168.0.x,则电脑的IP需要设置为192.168.0.x。
注意:不要把电脑的IP地址设置为和控制器IP地址一模一样,不然可能连不上。
设置完成后在设备树的控制器CTH3_C35_002S2上双击,可以打开控制器设置页面。在页面的“通讯设置à扫描网络”。如果搜索成功,则在Gateway-1下面会有对应的控制器。选中搜索到的设备并点击“设置活动路径”按钮,该操作会激活通讯设置,实现了编程环境与控制器的连接。
三、运行
1.仿真运行
本来是要直接连控制器的,哪知道不凑巧都出光了,现在手头没有,我也很无奈啊☹。咱们先弄个仿真运行测试一下程序。
首先按F11编译程序,在确认没有错误的情况下登录控制器(菜单栏“在线à登录到”),然后按F5启动程序。由于仿真模式下没有输入信号,我们可以打开输入模块DIT_16_16DI,在,点击IN[0]的“预备值”一栏,当其值变为“TRUE”时,按F7强制修改,这样模拟输入的程序开始信号。
按F7设置后,IN[0]的当前值会变为TRUE,这时跑马灯程序开始运行。打开输出模块DQR_16_16DQ,可以看到OUT对应的输出的“当前值”会循环变为TRUE。
当然,也可以在main程序的变量定义区看变量OUT的状态,因为OUT和输出模块是直接关联的。
用以上同样的方式可以改变IN[2]和IN[3]的状态来改变跑马灯的速度。然后通过IN[1]来停止跑马灯的运行。这里需要注意的是,由于输入变量没有做互锁,所以出现矛盾状态时,以程序中实际检查到的状态为准运行。比如开始IN[0]和停止IN[1]同时置为TRUE时,由于程序开头是先检查IN[1]状态再检查IN[0]状态,而IF在条件判断中使用OR,当第一个条件为真时,后续的条件会忽略,所以程序会停止运行,并清除输出状态。
通常情况下,对于输入信号互斥的情况,需要考虑互锁,避免程序出现非正常的状态。
2.连接控制器运行
这部分先欠着,以后有控制器了再补~~~^o^。
四、结论
很遗憾写这个的时候手头没有控制器,所以做了一个仿真运行。在程序比较简单的时候,仿真运行能够很快帮你实现程序的流程和功能调试。由于没有输入信号,模拟的时候难免会与实际情况不符。当然,连接实际设备也有风险,万一逻辑错了设备可能会乱跑。
有没有发现,其实通过上面的流程一步一步的来,CODESYS也没有你想像中的那么难学吧^-^~~~总的来说,编程开发是个实践性很强的活动,先不要想太多,让程序能正常的跑起来,然后再去研究为什么,学习起来应该会容易很多!
------------------
原创不易,感兴趣的多支持!