线下实训
HOME
线下实训
正文内容
plc编程什么叫指针编程 PLC编程,C语言中令人脑壳疼的“指针”怎么使用
发布时间 : 2024-11-24
作者 : 小编
访问数量 : 23
扫码分享至微信

PLC编程,C语言中令人脑壳疼的“指针”怎么使用

一个变量的地址称为该变量的“指针”

在CoDeSys中定义了一个变量,编译后系统会给这个变量分配一个相应的内存单元,根据变量类型分配相应的内存空间,举个简单例子,相当于家里来了客人,按一定的顺序安排落座,并且根据不同体型安排不同大小的凳子。

例如一个变量的类型为BYTE(字节),那么系统自动分配一个字节的存储空间,分配4个字节的存储空间给一个REAL型变量。内存以字节为单位,以“地址”进行编号,一个地址编号对应一个字节。

按变量地址存储数据的方式在高级语言中称为“直接访问”,例如定义变量Var是Word类型,编译后系统发分配两个字节1000和1001去存储,把地址1000和1001对应的值组合起来就是变量Var的值。

了解了数据怎么在PLC中保存和读取后,结合一个变量的地址称为该变量的“指针”。那么上例中地址1000和1001就是变量Var的指针。

在 CoDeSys 使用关键字“POINT TO+类型”对指针变量进行声明。类型可以为变量、程序、功能块、方法和函数的内存地址。它可以指向上述的任何一个对象以及任意数据类型,包括用户定义数据类型。

示例一:

程序中使用了 ADR 指令,该指令是用来获取变量内存地址的操作符,执行完第一条指令后,

PointVar内就已经获取了 var1 的内存地址信息(16 进制的 13B7143A)。

PointVar^指的是该内存地址中对应的具体数据(16#13B7143A 中的数据),即 var1 中 5。第二

条指令执行后,就将 PointVar^赋值给了 var2,故 var2=5。

示例二:

该 INT变量 nIntValue 的地址为16#13B71438,故完整的内存空间应该为 16#13B71438 和 16#13B71439。所以在程序中用到取低 8位 BYTE 的地址时需要在原地址的基础上+1,PointVar_byte_low:=PointVar_int+1;高 8 位 BYTE 的

地址为可以直接使用 16#13B71439。最终分别降低 8 位字节的 16#34 赋值给 nByte_low,高 8 为字节的 16#12 赋值给 nByte_high。

总结: 1.定义表达起来可能比较绕,咬文嚼字去啃定义;

2.指针没有想象的那么复杂,多思考多练习;

3.对于数据类型还不是很熟悉的可以先去找一下我之前的文章有介绍。

例说指针在PLC编程中的妙处

前言:

五一节前回答的《西门子200Smart指针怎么用?》被推荐到头条首页,还是很多朋友关心PLC中指针的用法和用处,本来是想着等我过了原创审核再来写的,现在知道了原创的审核不是那么容易过的,还是来写一写吧。

正文:

在悟空问答中我解释了200PLC中指针的两个符号,“&”可以理解为创建一个指针,“*”可以理解为取出指针指向地址中的内容,不理解的请再去看看我在《西门子200Smart指针怎么用?》中的回答。

在我前几天的文章趣说循环指令--C语言/LabView/S7-200循环指令对比中,我详细的解释了for循环命令的作用,今天的这篇文章就需要使用for循环指令来讲解使用指针的妙处!

说一下为何要强调我之前的这个回答和文章,因为如果之前的回答和文章朋友们不理解的话,今天我解释的程序,可能会让大家理解起来比较费力!

言归正传,直接看程序吧:

西门子200程序监控图

程序状态表的监控图

老规矩,先解释一下程序:

网络1:

首先是使用字符串复制指令将一串字符串“abcdefg”(7个字符)复制到VB0开头的字节中,此时VB0中是写入7,VB1-VB7中才是装着“abcdefg”这个7个字符。如果对这里不明白的,请去看看我前边写过3篇关于字符串指令的文章。

接着是指定一个指针&VB0,然后将这个指针装入VD10中;指定一个指针&VB30,然后将这个指针装入VD40中。大家可以看到&VB0处显示是值是16#08000000,&VB30处显示是值是16#0800001E,先前的文章我解释过,可以理解为就是CPU访问VB0这个区域的物理地址,访问16#08000000就相当于访问VB0,所以&VB0是一个指针,指向的地址是VB0。同样的&VB30也是一样的解释。

(顺便说一句图上的+134217728就是16#08000000,+134217758就是16#0800001E)

此时VD10中装的是&VB0指针指向的地址,而不是VB0中的值;VD40中装的是&VB30指针指向的地址,而不是VB30中的值。---是否感觉有点像说绕口令一样,多看几遍应该还是可以理解的!

网络2和网络5:

就是西门子200PLC中for循环指令的用法,for和next之间的程序,在for指令被触发后就不断的循环执行, 直到循环次数的计数值大于设定的终止值!可以从状态表处看到,VW100就是循环次数的计数值,VW100=9,而FINAL终止值设置的是8,所以9>8循环执行条件不满足了,就不再执行了!

此处程序是循环执行了8次,因为初始值是1,执行8次最后的计数结果是9。且通过状态图中的VD10和VD40的值,和网络1中的值比较即可知,都是被加了8次1。

网络3:

此处就是简单的循环一次加1一次,但是因为此时VD10和VD40中都是装的指针,所以这里就变成了指针指向的地址的改变,这也是使用指针真正的妙处所在!

VD10中是装着指针&VB0,此时指针是指向VB0,加1后就变成VD10中装着指针&VB1了,最终指向的地址就变成了指向VB1。所以,就这样一直循环一次加1,在每次循环的时候就指向一个新的地址。

网络4:

网络3和网络4都处于for和next的循环之中,网络3实现了在一次循环中改变访问地址一次,而如果改变一次地址,我就立即把地址中的值取出来,那么多次循环后,我就可以取出多个数据了。

所以,网络4的作用就是取出指针中的值,并存放。不过此处的程序是取出VD10指针指向的VB0开始的地址,存放到VD40指针指向的VB30开始的地址中。这里大家应该注意到一个问题,就VB0=7,而VB30=0,为什么呢?难道VB0没有被传送到VB30中?

答案近似于我说C语言for循环那个文章中的例子,就是因为网络3的加法运算,放置在了网络4的传送指令前边。所以在网络4执行MOVE指令的时候,VD10中的&VB0已经变成了&VB1,所以执行MOVE指令的时候是把VB1传送到了VB31中, VB0因为程序的关系,没有参与到MOVE指令中。这就是VB0和VB30中值不相同的根本原因!

而从VB1-VB8被MOVE指令传送到VB31-VB38中,循环执行了8次。

程序解读至此就结束了,相信大家已经领略到for和next指令,让程序循环的加1,实现了指针的自动变址,每次变更地址后,就立即取出,这样可以实现数据的集中读取,这也是指针使用的妙处所在。

文章结束,感谢阅读,如有问题请关注并留言,我会及时回复,谢谢!

相关问答

三菱plc跳转指令指针怎么编?

用个条件控制输出跳转指令,然后再在跳转指令后面地址接你想要的程序用个条件控制输出跳转指令,然后再在跳转指令后面地址接你想要的程序

plc如何调用程序段?

pLc调用程序段是一个复杂过程,这是速度很少不为我们察觉。首先保护断点,就是把调用指令后面的指令地址保存到特定的寄存器中(堆栈寄存器)。保护现场,就是把...

单片机中程序计算器(pc)是什么有什么用-ZOL问答

程序计算器(pc),也叫程序指针,它存储的当前数值就是将要执行的程序代码的地址...PLC与VB语言差不多,很相似有用(0)回复88911289看不太懂,不过发现好象按键扫...

plc指针的用法实例?

PLC指针的用法实例是可以通过指针来访问和修改PLC内存中的数据。例如,如果需要在程序中使用一个变量,可以先定义一个指针,然后将其指向该变量的地址。这样,在...

plc指针地址怎么写?

指针是用于地址操作的,不是地址里的数据,而是地址(装数据的各类容器,如:m,l,db,i,q等地址区域)。在没有前提说明的情况下p#0.0是指某个地址的首个位...指针...

三菱PLC中程序中有用指针P但未转移和调用?

三菱PLC有两种指针P、I。分支用指针(P)用来表示调转指令(CJ)的跳转目标和子程序调用指令(CALL)调用的子程序入口地址。中断用指针(I)用来说明某一中断源的中...

plc怎么加暂停指令?

...可以使用CJ指令来实现。定时器和计数器如果被CJ指令跳过,跳步期间它们的当前值被冻结,如果在跳步开始时定时器和计数器正在工作,在跳步期间,它们将停止计...

三菱plc指针说明书?

1.在程序中定义一个指针变量,如K100。2.将该指针变量赋值为一个寄存器地址,如D100。3.在程序中使用指针变量进行寻址,如K100.0表示D100的第0位。4.可以通...

三菱plc指针怎么添加?

关于这个问题,对于三菱PLC,指针的添加通常需要通过以下步骤进行:1.打开GXWorks3软件,并选择要添加指针的程序。2.在程序窗口中选择要添加指针的数据区域...

三菱plcsfc停止程序怎么写?

要停止运行三菱PLCSFC(SequentialFunctionChart)程序,可以使用以下方法:1.使用STEP关键字:在SFC程序的特定步骤中,使用STEP指令来停止程序的运行。例.....

 米拉 库尼斯  登封市卫生局 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部