johnsonxjq
必攻不守
级别: 略有小成
精华主题: 0
发帖数量: 149 个
工控威望: 333 点
下载积分: 469 分
在线时间: 70(小时)
注册时间: 2007-08-31
最后登录: 2023-12-11
查看johnsonxjq的 主题 / 回贴
楼主  发表于: 2018-07-03 09:21
图片:
三菱Modbus通信初始化,结构化编程,上面的首尾相联初始化成功,可以正常通信,
下面的书写模式初始化失败,端口不发送数据.失联状态.原因不明,哪位高手解释一下.
读写是用ADPRW ,在这里不要怀疑其它部分程序了,我只改这里,一个通信正常,一个完全不能通信
难道是三菱结构化编程还存在bug.三菱的推出结构化编程,真心比西门子的难用,写程序很慢,本人也是尝试
[ 此帖被johnsonxjq在2018-07-03 09:27重新编辑 ]
staunch
级别: 探索解密
精华主题: 0
发帖数量: 54 个
工控威望: 170 点
下载积分: 4817 分
在线时间: 56(小时)
注册时间: 2014-05-22
最后登录: 2024-04-16
查看staunch的 主题 / 回贴
1楼  发表于: 2018-07-03 13:57
顶一下,飘过!
instanttw
级别: 探索解密
精华主题: 0
发帖数量: 26 个
工控威望: 155 点
下载积分: 2292 分
在线时间: 39(小时)
注册时间: 2013-04-25
最后登录: 2021-11-04
查看instanttw的 主题 / 回贴
2楼  发表于: 2018-07-03 15:08
恶魔就躲在 EN 和 ENO。
SFC、ST 的样子不代表就是阶梯图的样子。
将两段程序写进 PLC 后以阶梯图读出来观察就会明白了。
johnsonxjq
必攻不守
级别: 略有小成
精华主题: 0
发帖数量: 149 个
工控威望: 333 点
下载积分: 469 分
在线时间: 70(小时)
注册时间: 2007-08-31
最后登录: 2023-12-11
查看johnsonxjq的 主题 / 回贴
3楼  发表于: 2018-07-03 18:11
恶魔就躲在 EN 和 ENO。
SFC、ST 的样子不代表就是阶梯图的样子。
将两段程序写进 PLC 后以阶梯图读出来观察就会明白了。

读出来,一个是M8411只有一个,全部初始化在后面,一个是M8411有多个,每个带两个Mov指令,逻辑上没问题呀,但实际唉,
三菱的编译器是否有问题?那就坑人了.
twingo49
级别: 网络英雄

精华主题: 0
发帖数量: 559 个
工控威望: 9134 点
下载积分: 20413 分
在线时间: 1013(小时)
注册时间: 2013-08-08
最后登录: 2024-05-04
查看twingo49的 主题 / 回贴
4楼  发表于: 2018-07-03 20:03
引用
引用第3楼johnsonxjq于2018-07-03 18:11发表的  :
恶魔就躲在 EN 和 ENO。
SFC、ST 的样子不代表就是阶梯图的样子。
将两段程序写进 PLC 后以阶梯图读出来观察就会明白了。

读出来,一个是M8411只有一个,全部初始化在后面,一个是M8411有多个,每个带两个Mov指令,逻辑上没问题呀,但实际唉,
.......

其實在modbus通信手冊第35頁已經有提醒了
本帖最近评分记录:
  • 下载积分:+5(johnsonxjq) 热心助人!
    johnsonxjq
    必攻不守
    级别: 略有小成
    精华主题: 0
    发帖数量: 149 个
    工控威望: 333 点
    下载积分: 469 分
    在线时间: 70(小时)
    注册时间: 2007-08-31
    最后登录: 2023-12-11
    查看johnsonxjq的 主题 / 回贴
    5楼  发表于: 2018-07-03 21:09
    引用
    引用第4楼twingo49于2018-07-03 20:03发表的  :

    其實在modbus通信手冊第35頁已經有提醒了

    我正是在此页看到问题才改的程序,但问题是这样不对呀,不符合规则啊.西门子的PLC就没有这样的说法.三菱的仿西门子还是有点莫名其妙
    twingo49
    级别: 网络英雄

    精华主题: 0
    发帖数量: 559 个
    工控威望: 9134 点
    下载积分: 20413 分
    在线时间: 1013(小时)
    注册时间: 2013-08-08
    最后登录: 2024-05-04
    查看twingo49的 主题 / 回贴
    6楼  发表于: 2018-07-04 08:36
    引用
    引用第5楼johnsonxjq于2018-07-03 21:09发表的  :

    我正是在此页看到问题才改的程序,但问题是这样不对呀,不符合规则啊.西门子的PLC就没有这样的说法.三菱的仿西门子还是有点莫名其妙

    不符合規則很正常的,要是都符合規則,表示寫一套程式就可以用在任何廠牌的PLC,沒有幾家會這樣做的。
    instanttw
    级别: 探索解密
    精华主题: 0
    发帖数量: 26 个
    工控威望: 155 点
    下载积分: 2292 分
    在线时间: 39(小时)
    注册时间: 2013-04-25
    最后登录: 2021-11-04
    查看instanttw的 主题 / 回贴
    7楼  发表于: 2018-07-04 10:09
    @johnsonxjq

    身边没东西可测试,以下只是猜测。

    复制代码
    1. INC(MOV(M8411, H1087, D8420), D0);
    2. INC(MOV(M8411, H1, D8421), D0);
    3. INC(MOV(M8411, K1000, D8429), D0);
    4. INC(MOV(M8411, K400, D8430), D0);
    5. INC(MOV(M8411, K10, D8431), D0);
    6. INC(MOV(M8411, K1000, D8432), D0);
    7. INC(MOV(M8411, H1, D8435), D0);
    8. INC(MOV(M8411, K50, D8436), D0);

    最后执行出来 D0 会是多少?
    如果不是 8,那就不用解释了。
    如果是 8,只能说三菱对于这样的设定有严格的限制,我们不清楚第一行执行后 PLC 内部到底做了什么事情。就算用阶梯图写一模一样的程序,通讯一样会失败,这和语言无关,手册也明确写了如何正确设定。

    以 ST 为例:
    复制代码
    1. D0 := D1;

    等同于
    复制代码
    1. MOV(M8000, D1, D0);

    也是
    复制代码
    1. LD M8000
    2. MOV D1 D0

    编译器还是呼叫了 MOV 指令,用 M8000 让指令一直执行,但不是无条件执行。



    基于文本程序的特性,人们更习惯 D0 := D1 而非 MOV,这样对于较为复杂的算式尤其方便。
    复制代码
    1. volume := 4.0 / 3.0 * PI * radius ** 3.0;

    这用 DEDIV、DEMOV 或阶梯图写起来就会较为复杂且不够直观。
    如果真有需求,我们就使用指令的 EN 参数或是 IF,像是
    复制代码
    1. MOV(M1234, D1001, D1000)




    但您提出的观点也对,如果连续几行的起始都是读同一个目标,如
    复制代码
    1. LD M8411

    那能不能将后面重復的省略以进行优化? 这样的话编译出来的程式就会是你想要的样子。
    这只有对于常数值才可以进行,如果 LD 的目标是会变动的,就不能将它省略。
    M8000 或许是一个特例,但也或许会在我们还不了解的状况下改变数值。


    所以就语言本身来说,其实没什么问题。小弟也曾被这个问题拐过,但正因为拐过,对于这些特性才有更多思考。


    提供参考。
    本帖最近评分记录:
  • 下载积分:+1(aaa2073) 热心助人!
    twingo49
    级别: 网络英雄

    精华主题: 0
    发帖数量: 559 个
    工控威望: 9134 点
    下载积分: 20413 分
    在线时间: 1013(小时)
    注册时间: 2013-08-08
    最后登录: 2024-05-04
    查看twingo49的 主题 / 回贴
    8楼  发表于: 2018-07-04 12:19
    其實重點在M8411,手冊有提到建議M8411只有一次(35~38頁),如果用超過一次,只有最後一次有效,第二種寫法會變成M8411用4次所以只有最後一次有效,因此通不起來。
    本帖最近评分记录:
  • 下载积分:+1(aaa2073) 热心助人!
    johnsonxjq
    必攻不守
    级别: 略有小成
    精华主题: 0
    发帖数量: 149 个
    工控威望: 333 点
    下载积分: 469 分
    在线时间: 70(小时)
    注册时间: 2007-08-31
    最后登录: 2023-12-11
    查看johnsonxjq的 主题 / 回贴
    9楼  发表于: 2018-07-04 15:07
    图片:
    引用
    引用第7楼instanttw于2018-07-04 10:09发表的  :
    @johnsonxjq

    身边没东西可测试,以下只是猜测。

    [code]INC(MOV(M8411, H1087, D8420), D0);
    .......


    谢谢你的回答,你的思考深入了,实际情况D0=0;另外,我用的是FX3U,结构化编程和ST编程竞然不能混用,和西门子相比,三菱的灵活性实在差很多,不过三菱,欧姆龙,台达都有结构化编程出来 了,向西门子这个龙头老大告拢.希望不久的将来,能形成大一统局面,为何不同的厂家不能使用同样结构的语言,来少去我们这些代码工人的劳动呢.虽然到那时写程序变得更没价值了.但毕竟这是进步.
    [ 此帖被johnsonxjq在2018-07-04 15:15重新编辑 ]
    johnsonxjq
    必攻不守
    级别: 略有小成
    精华主题: 0
    发帖数量: 149 个
    工控威望: 333 点
    下载积分: 469 分
    在线时间: 70(小时)
    注册时间: 2007-08-31
    最后登录: 2023-12-11
    查看johnsonxjq的 主题 / 回贴
    10楼  发表于: 2018-07-04 15:09
    引用
    引用第8楼twingo49于2018-07-04 12:19发表的  :
    其實重點在M8411,手冊有提到建議M8411只有一次(35~38頁),如果用超過一次,只有最後一次有效,第二種寫法會變成M8411用4次所以只有最後一次有效,因此通不起來。


    对,仔细看了下手册,的确有如此说法,如果这样说就和编译器有关.我想说的是,三菱这样做,像是在设陷井.
    erhaoshutong
    级别: 探索解密
    精华主题: 0
    发帖数量: 44 个
    工控威望: 137 点
    下载积分: 994 分
    在线时间: 2(小时)
    注册时间: 2017-11-18
    最后登录: 2018-08-14
    查看erhaoshutong的 主题 / 回贴
    11楼  发表于: 2018-07-08 21:40
    认真看手册,手册有说明的呀