| 作者 | 主题 |
|---|---|
|
芳季 至圣
经验值:72112 发帖数:15504 精华帖:101 |
楼主
主题:问一问自己做子程序自动分配背景数据的人。
当调试程序时怀疑自己的子程序在分配地址的时候可能出错,可能重叠,可能干涉等等的问题,并且带来了一些未知原因的影响,并且怀疑其原因与自动分配有关的时候。大家是怎么找回指定的调用里面的数据当时运行的瞬时值?怎么确定这种影响是否来自这个调用? 明知道自己安排了例如vb10000开始往后的地址,但是具体那个出问题的调用是使用了哪段V,你具体怎么找? 自从我普遍使用了自动分配之后,我得了一种恐慌症。由于间接寻址可以寻址到除HC;L;AC三者之外的任何地址。当发生一些意外动作的时候。总是担心就是这些间接寻址跑飞造成数据乱。单独测试并加入影响因素的测试总是没有问题。但仍不可排除真的设计出错。 目前,发现的问题并证实过,都是外部逻辑等问题,非子程序自动分配的问题。但是心里总是多了根刺。 比如,到了某种动作,由于间接寻址出错,突然一个写向了QB0,就那么一瞬间……一个扫描周期都不到就恢复了。根本监控不到 。如果一瞬间写向了VBxxx,那会牵连错得更离谱。 |
|
holdkcsxyz 至圣 经验值:13735 发帖数:1560 精华帖:24 |
9楼
主题:回复:问一问自己做子程序自动分配背景数据的人。1如果没用到向导或者库且子程序只有一个接口指针
A任意一个子程序里只有一个接口一级指针;则很容易找出子程序自身的干涉区:m==公共栈字节数+n个私有区*每个私有区栈字节数;子程序接口指针是&VBxx则这个子程序占用区是: VBxx到VBxx+m.
B子程序里除了自身的接口一级指针外,还有二级指针则如下图,变量表里的"#从数据址"是一个二级指针;此时m==公共栈字节数26个字节+n私有从站数12个*每个从站占用的栈字节23字节+{2*(N1读从寄存数+N2读从寄存数...+Ni读从寄存数)+4*(N1写从寄存数1+N2写从寄存数...+Ni写从寄存数)}大括号内是二级指针涉及的堆字节数;此时子程序接口指针是&VBxx则这个子程序占用区是: VBxx到VBxx+m. 2如果有向导或者库还要计算向导以及库的内存占用区 3对于强类型语言,如果向导和库也是A或者B那样的类似函数指针接口式的构成,则所有的占用区都可以方便的计算出来,动态数组集合等预留的存储区也可以编译时就算出预留的方便动态扩展的占用字节数. |
|
'Razor 至圣 经验值:24443 发帖数:3206 精华帖:41 |
22楼
主题:回复:问一问自己做子程序自动分配背景数据的人。仔细读了几遍,这和某大师搞的指针跳跳兔是一个套路。 哪里有什么“自动分配”,实质分明还是“静态预分配”。 全局依赖VD4092,这相当于把所有的鸡蛋都放在了一个篮子里,一旦VD4092被程序编写者、第三方库/代码块、HMI读写误操作或者覆盖操作,那简直就是灭顶之灾,风险极高。 在线监控也无从下手了,如果某实例出现问题,定位也相当困难。 性能开销也不容忽视,频繁交换数据操作,指针间接访问操作也是很“可观”。 在时序上无法禁用/启用某个子程序的调用。 综上所述,还是手动分配地址来得实惠稳定。
少即是多
|
|
芳季 至圣 经验值:72112 发帖数:15504 精华帖:101 |
62楼
主题:回复:问一问自己做子程序自动分配背景数据的人。 |
|
holdkcsxyz 至圣 经验值:13735 发帖数:1560 精华帖:24 |
64楼
主题:回复:问一问自己做子程序自动分配背景数据的人。仅供参考,错漏难免,自己在PLC平台上较少用这种自动分配方式,只是探讨一下,感觉全局变量直接寻址编程是PLC编程的精髓之一,主要还是要把工业现场的人情世故讲清楚就好,每个变量必须有寓意丰富且合适的中文名,绝没有临时变量,后续难说;在其他平台会向这种方式靠拢。 整个程序只有一个全局容器VD7100,核函数占用VB7000---VB7009;VD7100位于main中,它分配给子程序"子程序总容器"的接口空容器,其余的全部自动分配; V2.8版本L区较小,但是V3.0版本的Smart的子程序的L区有1024个字节,因此子程序"子程序总容器"有足够多的LDxx空容器分配从属于它的子程序(启动停止保持---子程序). |
|
不欲勿施 奇侠 经验值:8882 发帖数:835 精华帖:16 |
66楼
主题:回复:问一问自己做子程序自动分配背景数据的人。
13478405725
|