2004年09月26日
摘 要: 给出一种RS422/485网络中,模块可以接收任意极性直流供电和总线信号的设计方法。该方法允许将2根信号线或直流电源线在传输途中任意极性续接,容忍了布线施工中的反接差错,使工程施工大为方便

关键词: RS422 RS485 无极性 分续线盒 整流电桥 差分曼彻斯特

1 问题提出
现在的很多测控系统是使用RS422或RS485总线互连的。RS422/485总线信号是由4(2)根有极性的差分信号来传输的,不能将其反接。当网络传输距离长或节点多时,在线路上的分续线盒也会很多,很容易将信号线在传输途中接反,从而造成信号无法正常传输。虽然可以查出故障点,但在分线盒很多时,也是一件很费时的事情。为了布线方便,分续线盒的数量往往大于总线上的模块数。对于室内系统,网络线路一般外加PVC线槽甚至暗埋于墙体内;对于室外系统,线路一般架空或地下走线,造成对线路反接问题的查找和修正很困难。另一方面,为了施工方便,也应允许在途中随意接线,不分极性。为此,需要各模块既能接收图1(b)所示的正相信号,也能接收图1(c)所示的极性可能反相的RS422、RS485信号。

对于那些采取未经任何编码调制的基带信号来传输数据的RS422/485系统,图1中由于接线错误将造成收信方无法正确接收数据;但如对信号进行适当的调制后,即使途中出现接线错误,收方仍然能正确接收到数据,即在布线施工中可以无极性布线。

下面分别给出使用未调制信号和调制信号传输数据2种情况下的无极性接线设计方法。先讨论使用未编码调制信号的情况。

2 RS422信号线的无极性接线设计
RS422总线使用收发分开的信号线传输,各为2根信号线。为了使RS422接收器能够接收总线上传来的2种极性的信号,见图1(b)和图1(c),首先要检测到接线的错误,其次才是更正接线错误。这里希望通过网络模块电路来修正接线错误,而不是通过更正错误的传输线连接。

(1)人工修正方法
对于MCU的UART来说,无信号传送时,TX引脚为”1″电平,因此,RS422驱动器的A端会为高电平,B端为低电平,此时,在接收模块的A端也应为固定高电平。图2电路中,在一个接收端和GND之间连接一个LED,从而可以据此判断该端是和发送端A相连,还是和发送端B相连,然后通过4位拨码开关SW来人工调整模块总线和接收模块中RS422驱动器接收输入的连接。

人工修正方法需要发送模块在软件上进行配合。在调整时,发送方不能发送数据,也就是总线上的差动电压为固定的。这种方法,虽然有些麻烦,但在一些情况下,比起检查和修正线路来还是要简便一些。

(2)自动修正方法
如果在总线输入端子和RS422驱动器之间用电磁继电器(或模拟开关)代替拔码开关SW,就可以通过软件来自动控制总线A、B端的切换。检查是否存在错误接线也可通过软件进行,只要发送端发送一个和收方约定的固定内容数据,如果收方不能正确收到,则表明接线错误,就控制继电器切换总线连接;否则,不切换。必须注意的是,使用模拟开关时,应注意对线路阻抗和传输速度的影响。

3 RS485信号线的无极性接线设计
RS485总线中的发送和接收信号共用一对线,使用的驱动器可分为两类:一类是像SN75176之类的驱动器,在驱动器内部已经将Rx和Tx信号接到一起;另一类是使用RS422方式的驱动器,如发送和接收使用2个芯片,如SN75177(接收驱动器)加SN75178(发送驱动器),或者收发驱动器集成在1个芯片上,如SNLBC75179、MAX488、MAX490等,这种情况下,在线路板上将收发的同相端短接。对于后者(使用收发引脚独立的驱动器),无极性设计的方法仍然类同于RS422方式;对于前者,由于收发信号的同相端在驱动器内部已经短路,无法在接收驱动器增加电路,不能达到无极性信号传输的目的。

可见,在RS485网络中,模块必须使用独立收发引脚的驱动器时,才能增加无极性设计电路。

4 使用限制
以上方法只适合于点对多点的主从式RS422/485网络。对于RS422网络来说,在主模块中的接收驱动器不能加修正电路,而应调整到发送模块的发送端。因为在从模块发送而主模块接收的情况下,可能部分模块和主模块之间的连接正确,部分模块和主模块之间的连接错误。对于RS485网络来说,只要在从模块的驱动器接收端增加调整电路就可以了。

对于各模块平等通信的RS422/485网络来说,一个模块可能和其它模块之间的接线既有正确,又有错误,因此通过此方法来修正。

5 采取调制信号传输消除信号极性
使用以上2种(手动设置或软件自动配置)使模块可以接收任意极性信号的方法虽然可行,但仍然有一些麻烦:手动设置仍然会带来施工的不便,而自动配置会增加软件设计的复杂度,降低了可靠性。此外,以上方法也只适用于点对多点的主从通信网络,对于节点对等网络不能使用。另外一种消除信号极性的方法就是在对信号编码调制后传送,使调制后的信号是无极性要求的。在数据传输领域,最常用的无极性信号调制方法是使用差分曼彻斯特编码,其波形如图3所示。

差分曼彻斯特编码信号的编码原则是:
在信号位中间总是将信号反相;
在信号位开始时不改变信号极性,表示逻辑”1″;
在信号位开始时改变信号极性,表示逻辑”0″。

由此可见,经差分曼彻斯特编码的信号,见图3(b),经过由于接线错误变成反相的波形后,见图3(c),仍然符合此定义,从而可以解调出原始数据信号。

为了在RS422/485网络中实现差分曼彻斯特编码,需要在UART和RS422/485芯片之间增加编码电路。差分曼彻斯特编码属于自同步编码,因此需要时钟。对于工作于异步方式的UART来说,可以使用GAL器件完成编码和解码,但用于控制UART异步传输的波特率时钟和编码电路时钟必须使用同一时钟源。以下给出图4所示的实现框图,具体实现电路这里不再详细叙述。也可以使用专用芯片完成编码和解码,比如采用Echelon公司的FTT-10A收发器。该收发器对信号进行差分曼彻斯特编码调制后传输(同时包含一个隔离变压器)。

6 直流供电的无极性接线设计
在RS422/485网络中,常采用集中+5 V、+12 V或+24 V直流对所有模块进行供电,如线路较长,一般使用+24 V电源,较短时使用+5 V或+12 V电源。同信号线一样,电源线也同样存在反接问题,基于同样目的和原因,模块也应能使用正相和反相接线2种情况的输入电源。和信号不同,2根电源线虽然可能反接,线间的电位差始终是一个极性,要么为正,要么为负,因此,可以在模块电源输入处增加一个整流电桥,在电桥的输出端就始终能得到正极性的+24 V或+12 V、+5 V电压供自己使用了,如图5所示。

参考文献
1 Data Encoding. http://www.cpe.ku.ac.th
2 阳宪惠主编. 现场总线技术及其应用. 北京:清华大学出版社,1999
本文摘自《单片机与嵌入式系统应用》
2004年09月10日

    近日从网上发现了一个非常有趣的软件——私人磁盘(我经常会打成死人磁盘),当前版本为V3.70。该软件只有一个主程序(附带的那个Agent.dll没见有什么用,删了都能跑),使用相当简单,并且功能强大,起码从表面上看是这样,还号称加密强度一流!

    我当时就晕了,试用了一下,哎,还真吸引人。前段时间我也做了个加密虚拟磁盘来玩,但比起它差远了,首先我的虚拟磁盘不支持空间动态调整,而私人磁盘则完全实现了——巨轻松,它就象从源驱动器长出来似的,一切都是那么直截了当。还有就是,它那四百来K的超小SIZE直让我冒汗,我想俺算是密界最无知的人了。

    在强烈的好奇心驱动下,我耍起性子来了——俺就要剖了你!随便提一下,我分析(注意不是破解,我通常懒得去干)一个软件一般都不会去DEBUG来DEBUG去,费劲不讨好。先用eXeScope瞧瞧它的导入表吧,看看装了些什么东西。一瞧,狂晕……除了mpr.dll中的WNetGetConnectinA还有点发挥想象的余地外,其它都是三个代表。当然,我不排除写程序的兄台采用动态加载的方法,但这时我已对这没兴趣了。再CHECK CHECK资源吧,看看有没有在资源段内含了些SYS驱动什么的,RegMon、FileMon等就比较喜欢这套。结果是——NO!我更晕了,幸好今天没丢第N+1个钱包,否则就要打开窗户含泪跟大家道别了。

    连驱动都不用,那那那……是高手?唬我吧?我身躯本来就不庞大,给几大箩的问题一压,顿时更渺小了。在WINDOWS NT下,如果不通过驱动而直接在用户模式下建立加密虚拟盘是非常困难的,目前我只知道可以通过代理机制来实现,大家可以参考Galen C. Hunt写的Creating User-Mode Device Drivers with a Proxy,但该机制实现起来相当相当复杂,理智点的人都会优先考虑用DDK搭个驱动。开始的时候,那WNetGetConnectinA函数就在我的脑子里闪了一下,难道眼前这个就是传说中的Hunter?

    迅速打开RegSnap,配合私人磁盘跑了两遍,结果出来了:只在右键菜单扩展里动了点手脚,其它都没变。显然,Hunter还没诞生,如果采用代理机制,在注册表HKEY_LOCAL_MACHINE\SOFTWARE\URCS\ProxyDevices分枝下会有登记。我那本来就不是很好使的脑瓜进一步陷入昏迷状态,赶紧泡杯参茶喝下,总算及时抢救过来。到这时,我已肯定这兄台是蒙着俺的眼睛使巧了!巧巧巧,你巧巧巧巧,我看你往哪巧!再巧也不能不操作文件吧?说时迟那时快,FileMon已蹦出来,并依次记录了私人磁盘的四个动作:建立、打开、关闭、删除。一看FileMon记录,噢噢噢,亲爱的灰姑娘啊,我可揪到你啦!下面不正是吗?

    //在回收站里建立虚拟驱动器源目录
    C:\Recycled\UDrives.{25336920-03F9-11CF-8FD0-00AA00686F13}
    //构造一个虚拟驱动器回收站
    C:\Recycled\UDrives.{25336920-03F9-11CF-8FD0-00AA00686F13}\Recycled\
    //虚拟驱动器加载程序
    C:\WINNT\System32\subst.exe

    注意,subst.exe是Windows下自带的一个命令行小工具,用来将路径与驱动器关联,具体用法为:

    SUBST [drive1: [drive2:]path]
    SUBST drive1: /D

        drive1: 指定要指派路径的虚拟驱动器。
        [drive2:]path 指定物理驱动器和要指派给虚拟驱动器的路径。
        /D 删除被替换的 (虚拟) 驱动器。

    不加任何参数键入 SUBST,可以显示当前虚拟驱动器的清单。

    显然,私人磁盘整个工作机制是通过把回收站下一子目录指派给虚拟驱动器来实现的,由于回收站文件夹在Shell名字空间的特殊性,在里面自建立的文件或目录不会从资源管理器反映出来,从而达到隐藏源文件的目的。但是,在控制台模式下用dir /a就能让所有东西原形毕露。

    好,程序的工作机制已经搞清楚,那回到前面最重要的问题——加密。在私人磁盘里建立的文件是否经过加密并安全存储呢,现在是时候来找答案了。我在新建的虚拟盘根目录下建了个文本文件hello.txt,随便写了些东西,然后一顿关闭,连私人磁盘程序也结了。按程序上说的,现在的虚拟盘数据应该是“自动加密隐藏”了。对,藏是藏起来了,可还是能揪出来。用记事本程序顺利打开“C:\Recycled\UDrives.{25336920-03F9-11CF-8FD0-00AA00686F13}\hello.txt”,上面一个字也没变,害我咖啡喷了一屏幕。唉,失望啊。

    ——总结——

    在Windows下,单单做个虚拟磁盘并不是件困难的事,你甚至不用编写一行代码就可以用subst.exe来完成。但如果要支持加密,而且还是面向透明文件访问的加密,那就没那么简单的,区块解释、文件流加密、冲突控制、缓冲管理、设备管理等等都是非常头疼的问题,去分析一下StrongDisk就知道所有这些事情实现起来是多么的不容易。

    ——后话——

    刚拿到这个软件的时候,我是怀着十二分的敬意来看待的,因为自己也是个做技术的人,知道搞点东西很不容易,但知道来龙去脉后,就有了现在这篇文章。如果那兄台在描述这个软件的时候有一说一,就算没有加密功能,我也会叫好,因为其在巧上面做得的确有水平。诚然,不管是做人还是做事,灵巧是很重要的,但离开诚信和正直就一文不值了。这个私人磁盘软件是共享软件,叫价倒不高,也就¥30,用起来还算可以,就是在加密这个敏感问题上撒了谎,你买不买单就看着办吧。反正我是肯定不会了,至少对当前版本,我还要把钱省下来买瓶清洁剂——清洗我那无辜的笔记本屏幕和键盘。