打印

【求助】请各位版主,热心人等来看看!RS485掉线等故障!

[复制链接]
楼主: emailli
手机看帖
扫描二维码
随时随地手机跟帖
21
lixun00| | 2007-8-22 11:06 | 只看该作者 回帖奖励 |倒序浏览

掉线的单元,建议用一“移动式监控485设备”。。。

接到a,b两端,看看数据正不正常?(建议打印出来),

使用特权

评论回复
22
emailli|  楼主 | 2007-8-22 11:11 | 只看该作者

不是这个意思

pc和中继通信,确定中继没问题,再查终端。

系统设计本来是PC下发DA码。然后LPC2131转发给LPC922。但是后来没有这样做,因为发生了死机。现在只是让LPC2131计算DA码。然后定时发送。

::每一条在总线上传输的数据都会被每一个LPC922和LPC2131接受到。??
看来是256个。
 
我们肯定不会将所有的LPC922接一起啊。200多个接一起,那我还要中继干什么?
我这里第二层和第三层有N条总线。

每个第二层LPC2131有一个UART用来控制一条RS485总线。
如果有16个LPC2131,就有16条RS485总线。

这16条RS485总线不回互相发生联系的。

我这里想表达的意思是:传输的数据没有地址帧和数据帧的区别。

因为LPC2131不支持地址帧和数据帧的识别传输。

所以,为了区别是发给哪个LPC922。使用的是软件地址识别的方法。

每一帧数据传输在总线上的时候,每个LPC922都会接收到。然后他们解码,识别是否发送给自己的数据。

使用特权

评论回复
23
emailli|  楼主 | 2007-8-22 11:14 | 只看该作者

数据是否正常都不是第一步需要检查的点了

现在测试的是LPC922都不进入接收中断了。

因为只要他进入接收中断,我就会将一个IO取反,现象就是一个指示灯闪烁。

所以,无论数据误码与否、正确与否,只要有能够让LPC922进入中断,就会有灯闪烁。

问题是,现在掉线的模块这个 通信指示灯已经不再闪烁。但是他的程序运行指示灯却可以正常闪烁。

其他的未掉线的模块 无论是通信指示灯还是程序运行指示灯都在正常的闪烁。

使用特权

评论回复
24
erhui_cn| | 2007-8-22 11:22 | 只看该作者

RE:

因为随机,会不会是LPC2131发送给从机的地址发生变化了.没有了其中一台从机的地址...
佩服楼主中....

使用特权

评论回复
25
emailli|  楼主 | 2007-8-22 11:26 | 只看该作者

地址没有变化

曾经用RS485转RS232转换器搭在总线上观察数据。

利用PC和串口调试助手观察。

发现LPC2131发送询问命令没有出问题。

指示掉线模块不回数据了。

这一点可以排除。

使用特权

评论回复
26
emailli|  楼主 | 2007-8-22 11:29 | 只看该作者

上传示意图片

这个是系统架构示意

使用特权

评论回复
27
古道热肠| | 2007-8-22 11:55 | 只看该作者

软硬件都要找原因

    过去做报警系统时,一台主机(89C52)带128个从机(AT89C2051)在工程上应用也很稳定的。 用的是Max487E芯片。
   楼主现在的问题就一中位机与下位机通讯不可靠,首先应检查AB脚的信号质量,差分电压的幅度如何?排除硬件故障后,还要重点检查软件故障,中位机应召唤下位机不响应时,及时输出现场数据,下位机中断接收出现异常数据包时,也应及时输出调试信息,再根据这些信息综合判断。
   采用更低的波特率试试效果,比如2400bps.
   

使用特权

评论回复
28
gjg191| | 2007-8-22 12:19 | 只看该作者

dd

首先看你的协议有问题吗?再看程序!有可能有时候结构不合理就会出现问题,你可以用出现问题的终端单独跑一次看看.

使用特权

评论回复
29
农民讲习所| | 2007-8-22 12:32 | 只看该作者

把你的串口部分和协议解析部分发上来

使用特权

评论回复
30
lixun00| | 2007-8-22 12:34 | 只看该作者

这种结构我以前用51的(只是2层)分4路,每路。。

24个,波特率远高于9600都没出现过问题。看lz的分析是否可以认为终端单元出了问题?(假如数据经过485转换后数据正确)

使用特权

评论回复
31
lixun00| | 2007-8-22 12:37 | 只看该作者

同意ls的观点。。。

使用特权

评论回复
32
emailli|  楼主 | 2007-8-22 13:01 | 只看该作者

给出协议和实现代码

希望高手给出解答。

现在冒着风险给出代码和协议部分。
相关链接:https://bbs.21ic.com/upfiles/img/20078/200782213143483.rar

使用特权

评论回复
33
lixun00| | 2007-8-22 13:23 | 只看该作者

lz看看加一个接收计时器看看,另外用定时器。。。

定时检查相关寄存器状态,用端口指示出来。

使用特权

评论回复
34
emailli|  楼主 | 2007-8-22 13:27 | 只看该作者

寄存器的状态

定时器有采用。

我的主节拍就是用的定时器。

端口指示相关寄存器的状态可能比较麻烦。

没有足够的空闲IO。也没有显示界面。

等串口掉线了,想用串口发出来也比较难。

不过我会尝试一下做一个比较。如果比较不等就亮一个灯。

使用特权

评论回复
35
农民讲习所| | 2007-8-22 14:17 | 只看该作者

隐患

   u0rxbuf = SBUF;
    RI = 0;

    u0rxbuf &= 0x7f;                              // 
    {
        Uart.RxdPoint = 0;
    }
    else
    {
        if( (u0rxbuf==0x0a) && (Uart.Pool[Uart.RxdPoint-2]==0x0d) )
        {                                               // 如果收到结束标志
            Flag.RxdEnd = 1;                            // 收到完整的一帧数据
            Uart.RxdLen = Uart.RxdPoint;                // 
            ESR = 0;                                    // 禁止接收中断
        }
    }   


假如收到PC包,而又没来得及处理,Flag.RxdEnd 已经=1了。这时如果不是本机地址,其它92应答,本机会重新开始Uart.RxdPoint = 0;这时Flag.RxdEnd 应该是=0的,所以处理PROCC时会出错,缓冲里面不是真实数据。

应该在中断中判断地址。

你这样的程序很容易出错,结构不好。应该驱动->协议解析->任务应答三个层次分开。

使用特权

评论回复
36
emailli|  楼主 | 2007-8-22 14:32 | 只看该作者

目前均是这种结构做的多机通信!

请问:农民讲习所

            Flag.RxdEnd = 1;                            // 收到完整的一帧数据
            Uart.RxdLen = Uart.RxdPoint;                // 
            ESR = 0;                                    // 禁止接收中断

此时已经将ESR = 0;处理了。不会出现其他的应答而本机接收到的情况了啊。

第二:我的程序是按照 驱动,协议解析,任务应答 三个层次分开处理的。

不知道要分离到何种地步才好。还请给出一个示意图之类的。

第三:中断内实在是不好做地址判断。我现在在中断内指示判读是否一帧数据接收完全而已,解析和应答均在PROCC内进行。

针对这种数据帧结构,有没有比较好的 中断中判断地址的方案。

也请给出一个示意图之类的。

不用太精确的示意图。能够说明思路就可以了。

我的接受能力还可以 的。

使用特权

评论回复
37
erhui_cn| | 2007-8-22 14:40 | 只看该作者

re:

感觉2131没有问题.
问题出在掉线的从机是否真的死机了?因为你手动复位可以通信,那么串口接收中断关了?还是485转TTL时出问题了,没有中断访问922?

问个傻瓜一点的问题,怎么不用RTU格式的数据帧?

使用特权

评论回复
38
emailli|  楼主 | 2007-8-22 14:45 | 只看该作者

用RTU格式更加麻烦

RTU模式中数据帧的区分是利用时间来区分的。

将会导致一个硬件定时器的开销。

同时校验是采用CRC校验。比起LRC也要麻烦。

而我们的LPC922的RAM等资源有限。

用RTU模式更麻烦。

同时,用ASCII模式调试也更加简单,用串口调试助手直接可以读出数据。
并且在ASCII模式下看的话,刚好0x0D和0X0A实现换行功能
如果用RTU模式,调试就比较麻烦了。看数据要一条一条的自己切出来看。

使用特权

评论回复
39
农民讲习所| | 2007-8-22 15:09 | 只看该作者

俺一直提倡标准化设计,好像没多少人响应。

LZ的问题采用标准化设计的话,绝对不会出现这中莫名的问题。

这里俺再次推荐俺的培训教材:
    
相关链接:https://bbs.21ic.com/club/bbs/showEssence.asp?id=8047

使用特权

评论回复
40
emailli|  楼主 | 2007-8-22 15:19 | 只看该作者

?

你关接收处理,其它机器0X3A可能收不到。
其他922发出来的数据我没有接收到也没有关系啊。
至于Uart.RxdPoint溢出,我特意做了一个%70的处理,就是为了防止溢出。

另外,地址的解析,好像用switch不行的。

先要将数据从接收队列中拿出来,做了解码处理以后才可以解析命令的。

如果考虑到本机还没有来得及回复,其他的922就已经开始发送数据出来的话,必然会增加RAM的开销空间。而922的空间实在太紧张了。


PS:不过农民讲习所提出的建议很好。
我打算还是用队列的方式再将原来的程序改一下。同时将解析也拿出来到主程序中做。不过和你这个解析还有点出入。要先解码,因为传输的是ASCII码。不是HEX。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则