倍福PLC学习:编写函数块及简单调试
今天这篇文章我们来编写一个简单的电机控制函数块,并将其下载到倍福CX5020控制器进行测试,以熟悉TwinCAT3环境下基本的编程步骤。
打开TwinCAT3(TC3),按照上一篇文章《倍福PLC学习:扫描EtherCAT I/O子站并测试模块》介绍的内容新建工程项目并扫描EtherCAT子站,项目名称为“motorControl”。
在左侧项目树的“PLC”节点下右键单击,选择“Add new item(添加新内容)”,添加新的PLC项目,命名为“CPU1”,如下图所示:
添加完成后,“CPU1 Project”中会有POUs、GVLs、DUTs等文件夹。其中,POU是程序组织单元,GVL是全局变量列表,UDT是用户自定义变量。我们计划编写一个电机控制的函数块,因此在“POUs”文件夹右键单击,在弹出的对话框中选择“添加(Add)”→“POUs”,如下图所示:
在弹出的“添加POU”对话框中,选择功能块(Function Block),命名为motorControl,编程语言选择ST语言,如下图所示:
在函数块motorControl中声明变量,其中:
VAR_INPUT是输入变量,包含电机启动 、停止信号;VAR_OUTPUT是输出变量,包含输出信号(线圈);VAR_STAT是静态变量,包含沿信号检测变量;如下图所示(注意变量不区分大小写):
编写代码如下图所示:
为了分配参数,我们新建全局变量列表:GVL1,并添加变量如下图所示:
接下来要在主函数(MAIN)中调用电机控制函数块。首先在变量列表中声明motorControl的实例,命名为“motorControl1”,编写控制代码如下图所示:
单击工具栏“Build”→“Build CPU1”编译PLC程序。
单击工具栏“PLC”→“Download”下载PLC程序。
单击工具栏“PLC”→“Login”登录到在线状态,或者工具栏的快捷按钮,如下图所示:
如果PLC处于未运行状态,单击“Start(启动)”使其运行。本例程为了给出电机启动信号,我们将全局变量“startBtn1”的“Prepared Value”设置为“TRUE”,并单击工具栏“Write Values”按钮将该值写入到PLC中,如下图所示:
此时可以看到主程序MAIN中电机输出信号为TRUE,如下图所示:
如果想让函数输出对应到实际的输出模块,在“CPU 1 instance”→“PLCTask Outputs”→“GVL1.coilKM”,将其对应到“Linked to”指定的输出模块即可。
好了,关于倍福PLC编写函数块及简单调试就先介绍到这里。
用PLC的指针实现字符串转byte(Codesys平台)一文极简搞懂指针
第一步,确定配置
Codesys平台下的倍福Twincat2软件,和MES上位机,进行TCP/IP通信,进行数据的收发,只能收发Byte,不能直接收发字符串(很多PLC之间的通信都有这个问题,很难处理)。
第二步,问题描述
最近调了个改造设备,改造前是德国老外写的程序,MES程序里面数据交互有用到指针的地方没看明白,故在此深入研究一番,老外的程序过于复杂,我就单独把这块功能给拿出来做个功能块程序模拟下,如下图(先不用看这段程序,下面一步一步分解):
第三步:技术逻辑分析
MES和PLC通讯,字节传输,如果我想把PLC的字符串传给MES,必须要把PLC的字符串转变成字节,再传给MES,这不是很简单吗,正好程序有标准得STRING TO BYTE 指令,转一下不久OK了?
于是乎我写了一条这样的指令:srrr为byte,sKeyword为字符串。
不模拟不知道,一模拟吓一跳;不管我输入什么字母,srrr结果都是0 ?????
但是输入数字结果就对了如下图:输入字符串20,srrr为16进制的14,对的上。
这条指令是只能把数字类型的字符串转换成数字,例如字符串格式的数字‘20’,用STRING TO BYTE指令,只能把字符串‘20’,转换成十进制的数字20,字母是无法转换的。
我了个去!!
这个转换指令一点用也没有啊!!!
没办法,只有深入研究一下,字母怎么转byte了。
首先我模拟plc需要发一串字符“ABCDEFG”给MES,转换过程的数据结构如下图所示:
“ABCDEFG”转换成BYTE需要7个BYTE作为存储空间,每个字母用一个BYTE,通过ASCII码转换成10进制或16进制表示。
首先大家想到的一般都是每个字符ASCII码转换成数字表示,再组合起来用,发送过去,就可以了。但是这种方法麻烦,如果有上千个字符,一个个转,就相当花时间了。
下面就介绍用指针的方法处理这类问题.如下图:
1/先定义sKeyword字符串,这个是我要发送给MES但是还没想到好方法发过去的字符串;
2/定义一个指针pKeyword指向一个byte,存储字符sKeyword的地址;
3/定义一个指针pSendToMes指向一个byte,存储需要发送给MES的byte的地址(程序里定义strSendDate为2000个byte);
4/定义一个结构strSkeyWordDate, 这个作用是把每个字符串的值都按顺序存储在这个结构里,最终发给MES。
程序解析如下:
pKeyword:=ADR(sKeyword);
把sKeyword的地址写入指针pKeyword;
pSendToMes:=ADR(strSkeyWordDate);
把strSkeyWordDate的地址写入指针pSendToMes;
FOR iCounter:=1 TO LEN(sKeyword) BY 1
循环指令,循环字符串sKeyword的长度值,有两个字符就循环两次,三个字符就循坏三次;
DO
pSendToMes^:=pKeyword^;
^为取值指令,把pKeyword存储的地址里第一个byte的值,给pSendToMes的第一个Byte(为什么是第一个byte的值,因为指针指向一个byte)
pKeyword:=pKeyword+1;
指针存储的地址值加1,即指向pKeyword存储里的第二个byte。
pSendToMes:=pSendToMes+1;
指针存储的地址值加1,即指向pSendToMes存储里的第二个byte。
END_FOR
如果我发的字符串为ABCDEFG,那么会经过7个for循还,第一次循环给strSkeyWordDate的第一个字节赋值为41(程序为16进制表示),也就是大写的A,依次反复七次,strSkeyWordDate的前7个字节为16进制的41 42 43 44 45 46 47,ASCII翻译过就是ABCDEFG,这就完美解决了,字符串转Byte的需求。
第四步:技术分析指针数据
结合以上程序如下图,比如sKeyword的值是ABCDEFG,pKeyword为对应第一个字节的地址45492,pKeyword^为地址45492提取的值41,pKeyword+1则是地址加1,地址变为45493,对应的值为42.循环七次得到想要的数据。
OK!就分析到此,我是明白差不多了,有疑问评论区问我!!
相关问答
倍福PLC怎么快速入门?
倍福PLC与一般的PLC还不一样,要倍福PLC入门先需要了解软件的使用,在有指令的的应用,倍福由于是用ST语言写程序,相当于C语言编程,会C语言编程上手会快很多倍福...
倍福plc如何上传程序?
要上传倍福PLC的程序,首先需要连接PLC和计算机。可以使用编程电缆将PLC与计算机连接起来。然后,使用倍福PLC编程软件,如倍福PLC编程软件或倍福PLC编程工具,...
西门子STEP7通过以太网怎样与,倍福TWINCATPLC通讯?
西门子PLC和倍福的PLC以太网通讯协议不一样的,需要通过转换网关转一下。西门子PLC和倍福的PLC以太网通讯协议不一样的,需要通过转换网关转一下。
倍福plc程序怎么解密?
1.解密倍福PLC程序是可能的。2.因为倍福PLC程序通常采用特定的加密算法进行保护,使其难以被非授权人员解读和修改。但是,通过逆向工程和破解技术,可以尝试解...
为什么我的电脑和倍福PLC连结不上?
电脑侧上位机的SIEMENS软件里面,设置PG/PC接口,选择对应网卡,IP地址和PLC一个网段但不能重复,网关相同。通讯对象MAC地址填写PLC的MAC地址就行了。不过你的...
德国倍福plc支持MODBUS通讯?
这个是没有的,带modbustcp功能的,都得是带网卡的控制器才可以呀这个是没有的,带modbustcp功能的,都得是带网卡的控制器才可以呀
倍福el2008模块还要导程序吗?
倍福EL2008模块是否需要导程序,这主要取决于具体的应用场景和控制需求。倍福EL2008模块是一个8通道数字输出端口扩展模块,主要用于工业自动化控制领域。它具备...
修改倍福plc的ip步骤?
修改倍福PLC的IP步骤如下:1.打开适用于倍福PLC的编程软件(如GXWorks2)。2.连接PLC和计算机。确保计算机与PLC之间有可靠的连接,可以是通过以太网连接或串...
倍福plc支持profibus-dp总线吗?
倍福PLC只是一个CPU模块,如果你想用总线通讯,买一个总线模块就行了,倍福的profibus-DP总线模块型号是BK3010,BK3100,BK3110|PROFIBUS总线耦合器。以上...
施耐德plc编程软件是什么?
wido,小型plc,可完成一般的自动化任务,比西门子S7-200性能稍弱,编程平台是TwidoSoft或TwidoSuite;M218,小型plc,可完成一般的自动化任务,比西门子S7-200.....