Chinaunix首页 | 论坛 | 博客
  • 博客访问: 72287
  • 博文数量: 14
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 23:59
文章分类

全部博文(14)

文章存档

2009年(14)

我的朋友

分类: C/C++

2009-05-06 14:10:32

 
2009.04.30
月底了,自己花在ModBus上面的时间已经很多了。从刚开始的熟悉协议到阅读周立功的源码,加上期间自己考驾照一周,打篮球眼角缝了几针修养了一周,不知不觉一个月就这样飞快的过了,而ModBus的学习进度却像蜗牛爬一样。都没有什么进展。原先的计划是先把ZLG/ModBus移植到EASYARM2104上面,然后自己把整个上层协议写一下,却发现,自己去卡死在移植这上面。因为移植过程中总是会出现各种各样的莫名其妙的问题。有时候真的想,如果不涉及底层那该多好啊。至少我这个人物是早就可以完成的。经过N次的折磨开发板及被折磨之后,今天晚上终于移植成功了。
ZLG/ModBus提供了上层协议,涉及到底层的那些函数要自己写。比如,串口发送接收函数,定时器的初始化及其中断的设置。源程序里面带着一个不完整的基于Magic2410的实验代码。但是这个平台跟我现在在用的EASYARM2104还是有差别的。Magic2410的mcu是三星的S3C2410,ARM9,内部有四个定时器。而EASYARM2104的mcu是LPC2106,ARM7核,两个定时器。 这那个实验程序里面,就是充分利用了四个定时器来。其中一个用作uC/OS II的时钟节拍发生器,剩下三个分别实现T15,T35,T10mS。那我在移植的时候就呆了。LPC2106只有两个定时器,一个给uC/OS II 用了,剩下一个怎么能实现三个定时呢?
我这边试了几种方法:
1)把Timer1用来实现T15。 T35用UART0的CTI中断来实现。T10mS就直接用uC/OS II的延时函数来实现。
用这种办法,把Slave程序烧写到板上。然后主机上上面打开ModBus调试精灵,想从站发命令。发现,该命令可以接收到。即在ADU的缓冲区里面看到发过去的命令,但是ADU没有进一步处理,没有成功提取出PDU。而这部分的工作室由CTI中断实现的。也就是说,发生CTI中断。但是我之前的设置都没有问题啊!!查看了LPC2106的manual guide,才知道问题出在哪里。
我在初始化UART0的时候,把激活接收中断的触发点设置为一个字节。这样,一点U0RBR寄存器里面有数据,就发生中断,该终端会调用ReceivOneChar函数接收一个字节。如果命令有八个字节的话,就会发生八次这样的中断。而CTI中断的触发条件是:当UART0 Rx FIFO包含至少一个字节,并且在接受3.5至4.5个字节的时间内没有发生任何的UART0 Rx FIFO动作时触发的。也就很明显了。一旦FIFO里面有一个字节,都会发生RDA中断,数据就会被取走。故前面那个条件无法满足。也就无法激活CTI超时中断。
2)用Timer1实现T15,T35则利用字节数做为出发的条件。
3)用Timer1实现T35,T15则不实现,UART0发动的时候,连续发送就好了。而此时T35触发的中断,完成ADU的检测,及ADU2PDU的处理。
to be continue...
阅读(1713) | 评论(1) | 转发(0) |
0

上一篇:uC/OS II 移植笔记

下一篇:ModBus开发笔记 2

给主人留下些什么吧!~~

skyformat992017-03-30 16:11:43

虽然modbus看起来比较简单,但是如果不注意,则字节序或者大小端一堆问题。

造成遇坑不断,打击信心。
个人觉得有2本书可以参考看看。
1)《从Modbus到透明就绪》,机工社出版,应用为主。《从Modbus到透明就绪:施耐德电气工业网络的协议、设计、安装和应用》分为5大部分12章,第1部分介绍了施耐德电气公司协同自动化的战略;第2部分介绍了Modbus协议和串行链路的物理实现;第3部分介绍了ModbusPlus工业令牌网络的设计和安装;第4部分介绍了ModbusTCP和透明就绪工业以太网的规划、选型、安装和服务;第5部分介绍了施耐德电气公司的工业网络在工业领域里的应用。

2)《Modbus软件开发实战指南》,清华出版社出版,开发为主。内容着重讲述如何快速入门并精通Modbus软件开发技术,适用于初学Modbus通信协议的读者,可以看看。


有这两本参考书,认认真真的学习一下,modbus就应该完全掌握精通了。个人意见供参考。