恭喜,你发布的帖子
发布于 2022-09-08 13:47:58
60楼
10个站点读写,要改程序吗,
还是改数据块就行。
程序块应该不用修改.
有两种使用方式
(一)改数据块
1 改数据块-公共数据:#全局循环-读写任务总数,由用户项目实际情况确定,#恢复毫秒(掉站后下次尝试通讯时间间隔)默认20秒或设置其它;
2 #从波特率,#从端口号,#从校验码,#从超毫秒(这四个是MBUS_CTRL的公共参数);
3 为新增任务分配新的私有数据:#从站地址 ,#从读写控,#从寄存址,#从寄存数,#从数据址(这五个是 MBUS_MSG的参数.其中读任务正常分配,写任务的#从数据址要分配两倍于#从寄存数的大小,比如要写N个寄存器,则#从数据址占用&VB(XX)---&VB(XX+4N-1))字节大小,即占用从#从数据址&VB(XX)开始的4N个字节.
4#函数指针-由用户分配一个确定地址,由此地址偏移10后取双字,双字内容就是要设置的公共全局-#全局循环-代表读写任务总个数;#函数指针偏移37则是需要设置的第一个私有读写任务的#从站地址;第(i)个私有读写任务和第(i-1)个私有读写任务的#从站地址相差23个字节,以此类推.
(二)不改数据块,把数据块里内容都移到OB1里
具体数据分布可参考"数据块"里面的偏移量, 数据块里的偏移量都由#函数指针&VB7000地址开始偏移.
-----------------------------------------------------------------------------------------------------------
(一)没太多动力修改针对写任务的抢占优先级,抢占优先级在很多情况下是很重要,资源是有限的,比如有交换机机制的/路由机制的/快速的/现有硬件串行的/TCP/UDP也有抢占优先级的概念(比如PN-RT);
有些开发平台也有把某某任务抢占到XX级优先级的配置;控制类的急停按钮等"软硬件事件"有迫切的优先级需求......
(二)抢占优先级看似很简单,做好了也很复杂,就简单ModbusRTU-Master
(1)优先级(初定为:2字节的单字),原来的字节方案可能要修改,不修改也是可以此时优先等级是0-127,扩展1个字节占用后优先级等级可以设置0-32767,即使是127级也基本不怎么被用到的,但即使你真的把某个任务优先级配置成127或32767也是合理的并且也要被正确的执行的
(2)时间戳(CPU自己晶振相对个数的计数)(初定为:6字节(2字节圈数,4字节毫秒数)),毫秒级基本是够了,性能好的CPU直接用长整型ns了
(3)#从变才写(初定为:布尔量)以上这三者都是要考虑的
(4)并且要考虑#从被跳站以及恢复时间是否到达,因为这关系优先级排好的队列的哪个任务(最高的如果#从被跳站且未恢复则考察队列的下个元素,依次类推)是要被紧接着的本次任务执行的.
(5)针对产生了#从变才写(写任务发生变化)的站点,但此时该站点#从被跳站且未到恢复时间(被恢复的形式目前仅有时间恢复也可以添加条件恢复),也可以不参与优先级排队.
(三)初定的字节占用表示方式也是有一定考虑:
(1)优先级的2个字节和时间戳圈数的2个字节构成4字节的双字,可以应用现成的双字比较指令
(2)时间戳的毫秒数单独用双字比较.这样貌似较少了"方法"的时间消耗
(四)Ch_Write出某次内循环得到#从变才写结论的同时,考察#从被跳站等逻辑后,比较以上8个字节(64位)的大小然后安排紧接着的"外循环序号"(这个序号关系着即将赋给Smart_MP的#全局循计的值是多少)插队位置,Smart_MP还记住被插队位置以便执行完优先级高的任务后从断点处开始来保证回来后需要轮询的平级的读循环都能"雨露均沾"
(五)写下去且写成功之后考虑对优先级队列进行出队处理,写下去但未成功也考虑对优先级队列进行出队处理(但要恢复#从变才写==1以便恢复后紧接着参与下次排队)
请填写推广理由:
分享
只看
楼主