与大约六块自己生产的仪表进行串口通讯(以后还会增加仪表),中间用了485转232转接器,使用modbusrtu协议。
其中有个功能是针对仪表中的设定流量进行修改,六快仪表的地址是:从1到6。 现在有两个问题:
1:做试验时只与一快仪表进行通讯,波特率为2400(仪表里面波特率不能修改),采集时间200MS(试过不同的采样时间都不行)。采集4个参数,有三个是保持寄存器的,有一个是输入寄存器的。画面上刷新的速度很慢,大约十秒才会有更新显示。开始怀疑是485转232的转接器有问题,后在modsca软件里看数据刷新的速度很快(我用电位器输入一个电流信号),只有不到1秒中就看到结果了。不知道是为什么?
2:在对一个寄存器进行修改的时候,有几率修改不成功,不知道是哪设置有问题?
3:以后要对六块的仪表里面的参数(也就是自己设置的I/O变量)由于六块仪表对应六个485地址,我需要做六个修改界面,那以后要扩展到几十快仪表,那做的界面不是太恐怖,我想只做一个界面,能在选择不同的仪表时,把里面修改的那个数值能连接到不同的I/O变量,我想到在数据词典里建立一个内存变量,但是这是对某一个地址某个寄存器进行写操作,也没找到相应的函数,请教各位达人·!
1 上位机的刷新速度要看你串口参数和数据量而定。如果是你自己编写的上位机采集,你把采集时间设定为200ms,有没有考虑过采集的数据需要多少时间、有没有考虑到下位机的相应也需要时间、有没有考虑超时问题、有没有完全按照modbusrtu协议去写通讯程序?
很多初学者都不会认真的去看完modbusrtu的通讯协议,从来不考虑响应时间问题。如果用定时器每200ms就发一条信息,考虑下位机响应时间,将会导下位机根本没来得及反馈数据就开始接受下一帧数据或者下位机返回数据时上位机又发请求导致通讯打架,最后致整个网络基本不能正常通讯。所以,尽量要按modbusrtu的要求去做,上位机采集程序加上1s超时或者收到完整的响应数据后,才去发送下一个控制器的请求。人家的测试软件基本可以立即看到数据,你可以查看测试软件的数据流,人家都是等待请求响应后才发下一帧数据,而不是像初学者的自认为接收完了就乱发请求,导致通讯乱七八糟根本不能正常。
2 这个问题关系到编程的共享内存机制问题了。比如,一般都是发现读取/写入到的数据跟定义的值不一样才去改写定义值的,而不是每次读取/写入就去改定义值吧?而且多机通讯时,还要保持一个循环周期完成后才确定是否要改写定义的值。如果你每个指令都来修改定义值,那程序就没能实现想要的效果了。所以,必须考虑到共享内存机制的问题。上位机时,写操作优先权最高;下位机时,是否要改写设定值先比较不相同后再去改写后保持上位机一个循环时间后再开放改写功能,这样就保证下位机本身和上位机可以同步修改下位机的一个内存值而不会导致乱七八糟问题。
3 这个问题比较好解决。先定义一个类,类里面就是从机地址、需要用到的其他通讯参数、需要用到的数据地址已经数据变量、类的界面属性、方法、事件。定义好这样一个类后,就可以多次引用这个类,通过改变这个类的一个从机地址属性值就可以实现界面绑定设备了。不算复杂。
咱不是达人,以上纯粹个人扯淡。
做过DDC跟组态王通讯的9600比特率,36个字、12个线圈,一共26个设备,一个循环周期最快6秒,最慢10秒。实时数据采集存档。
编程,需要的是10%想象力和90%的编程实践。