1.编程界面比较简单,具备plc开发编程的四种编程方式。梯形图语言ld ,指令表语言il,结构化文本语言st,功能模块图语言fbd。
2.官方使用手册。学习资料实在是太少,目前都是自己比较费劲的研究。
3.2 creating your first project on openplc editor – autonomy
3.openplc 在其他平台上,比如esp32,raspberry pi,引脚固定,所以有规定好的io映射地址。但是在linux 上引脚不固定,所以只能自定义调用或者映射。
以下是使用c语言 文件读写 驱动的方式调用io。
4.ide支持c语言编程,需要用 { } 限制
如上图,新建一个工程,选择结构化文本 “程序” ,“程序”相当于main函数可直接写代码运行而不需要添加main函数。
5.变量定义
区域1,新建变量的地方,注意 数据类型 在iec_types.h中定义的,这里面的int 实际是short
变量的 “位置” 是可以定义 modbus tcp的地址,比如set变量 %qw1 是06功能读写地址 1 ,用网络调试助手发送 “00 00 00 00 00 06 01 06 00 01 00 07” 就是设置 set = 7。
adc变量 %iw1 就是 04功能码读 ,用网络调试助手发送“00 00 00 00 00 06 01 04 00 01 00 01”,就可以读adc的值。
具体modbus定义查看手册 2.5 modbus addressing – autonomy
区域2 ,{ } 内属于c语言环境,可以定义c语言的变量,数据类型,还是跟c语言编程方式一样。{ }外属于 结构化文本st 的环境,只能用st的编程写法。如区域3的 if then end_if;
区域3,st的编程环境写法。st语法查看 https://wenku.baidu.com/view/b3171ac7f111f18582d05a9b?aggid=b3171ac7f111f18582d05a9b&fr=catalogmain_&_wkts_=1711095409579 区域4, 具体c语言逻辑代码,还是在 { } 内。
1》两个环境内的变量如何相互调用
st的变量在{ }内调用的是大写的变量,比如 adc 括号内使用{ adc或者data__->adc },因为在工程编译后的文件里不管是变量名还是函数名都会编译成大写的,具体可以去工程文件夹里查看那些 .c 文件。
2》 两个环境内变量如何相互赋值
两个函数 setfbvar( m1, m2) 和 m2 = getfbvar(m1),
setfbvar( m1, m2): 把c变量m2赋值给st变量m1。
m2 = getfbvar(m1): 把st的变量m1赋值给c变量m2。
两个环境的数据类型定义不同,所以不能直接赋值,不然就会报各种数据类型不匹配的错误。
3》 带有modbus 地址的变量 如何赋值。
比如上图的 adc 变量是 %iw1 读数据,用于读取外设的adc采样值。这种变量是不能在
{ } c语言中直接赋值,会报错。再定义一个 adc0 本地变量,在{ } 内把采样值setfbvar(adc0,adc_get),再{ }括号外 adc := adc0 ;
6. 函数定义
新建一个 “功能” ,选择 结构化文本st,函数名要用大写,比如上图。因为编译后的函数名会变成大写,小写的函数名是不识别的,调用大写函数名。
0》 c语言头文件引用
在ide中添加, openplc_editor-master/matiec/lib/c 文件夹下 iec_std_lib.h 中添加引用头文件
编译器已经添加的 stdio.h 等基本头文件,printf()可以直接使用,但是文件操作fcntl.h这样的需要自己添加,如上图。
在runtime中添加,openplc_v3-master/webserver/core/lib 文件夹下 iec_std_lib.h 中添加引用头文件。
在ide上添加到头文件也需要同步添加到runtime中,runtime上传程序时会重新编译代码,不然就会报错。
1》 函数的输入输出变量
定义了一个printf_str 的函数,注意 “返回类型” int,是一个默认的返回值。还定义了一个输入in 和一个输出 set 。也就是调用这个函数传入一个输入值,会返回两个输出值一个set一个默认。
默认的返回变量就是函数名,如上图的 printf_srt = 121; 输出set=111.
在system 程序中调用
out = printf_srt(1,0,500,&yun); 前两个(1,0)是编译后的两个默认参数,可以去编译后的文件pous.c查看,按理说是不需要填入,但是会报错参数个数不匹配。500是输入变量in,&yun是接收返回值set的值(注意返回数据类型要一致,int 对应的是dint,short 对应的是int)。out接收默认返回值printf_srt。
2》 c语言编程 点灯
总体还是用c语言编程方式用文件读写驱动控制io。
新建一个 “功能” ,led_set,一个输入开关变量。
在system程序中调用
通过modbus变量set,可以使用网络助手发送“00 00 00 00 00 06 01 06 00 01 00 01” 开灯,发送“00 00 00 00 00 06 01 06 00 01 00 02” 关灯
3》 adc 读数据。
调用
{ float adc_get; }
{ adc_read(1,0,&adc_get); }
4》 其他驱动写法一样,还是c语言读写驱动。
7. 更改程序循环周期
默认是20ms
8.点击编译,生成 “.st” 的程序
9. 目前就会这些,感觉就是怪怪的,有些东西跟别人或者例程写法不一样,还有些功能比如c扩展也用不起来,在编译器上编译能过,但是放到runtime上就编译不过。
有什么更好的资源可以推荐共同学习下。
10.代码示例见绑定资源。
11. 后续更新 地址映射io,通过读写地址方式读写驱动。
发表评论