【摘要】用rs485串行通讯构成的总线型的分布式数据采集系统,数据采集模块可以进行单独采集测量,但采集结果需由上位机进行数据显示,保存,分析处理等操作,系统上层软件基于delphi开发平台,采用简单的非重叠i/o模式,通过合理的设置,有效地解决了i/o读写阻塞问题,增强了系统运行可靠性;由于采用分布式i/o采集模块,整个系统具备良好的扩展性。 【关键词】串行通讯 delphi rs485 分布式数据采集 串行通讯因其线路简单,开发相对比较容易,所以经常应用于各种监控、测试和自动化设备中。而rs485串行总线接口采用平衡发送和差分接收的方式进行数据通讯,较rs232提高了抗共模干扰能力和传输距离,其在适当的波特率下通讯距离可以达到1千米以上。rs485总线可用于多个带有rs485接口设备的互连,以实现数据高速远距离传送,其连线十分方便,鉴于以上优点,rs485总线在 1.通讯端口的打开 begin mscomm1.commport=1 //确定串口号 mscomm1.settings=“9600,n,8,1” //波特率的设定,校验方式,数据位,停止位 mscomm1.portopen=true//打开串口 end 2.指令送出 begin mscomm1.output:=’$01’+chr(13) //读取地址为01的模块数据 end 3.数据接收 begin edit1.txt:=mscomm1.input //把接收的数据显示在edit1控件上 end 4.结束系统 begin close; end 以上是单个功能的设计,实际设计中要复杂得多,下面是本人在设计使用的一个过程函数 procedure tformadamcomm.mscommacomm(sender: tobject); var sss:ansistring; //串口数据 ci:byte; //di,do模块判断 qii:integer;//串口故障对比 begin if not mscomma.portopen then exit; if intadamcly<1 then exit; qii:=mscomma.commevent;//读串口故障号(1004-帧错误) if qii=1008 then mscomma.inbuffercount :=0; //接收溢出 if qii=1010 then mscomma.outbuffercount :=0;//发送溢出 //if qii<>2 then exit;//=2接收到预定数的字,中断时用此句 //读串口数据 sss:=mscomma.input; mscomma.inbuffercount :=0;//清接收缓冲区 //数据和接收显示 ci:=intadamcly;//模块号 editdata.text :=sss; adamgrid.cells[13,ci]:=sss;//显示 if length(sss)<2 then exit; labelread.tag :=labelread.tag+1; if labelread.tag mod 2=1 then labelread.color :=clolive else labelread.color :=cllime; //ad、di数据转换、显示 if (ci<1) or (ci>cons_modnad+cons_modndi) or (sss='') then exit; if sss[1]='!' then padamdatachange_di(ci,sss);//di数字量 if sss[1]='>' then padamdatachange_ad(ci,sss);//ad模拟量 end; 系统的上位机软件采用delphi开发平台,移植微软的mscomm控件,利用它可以方便地对串口操作,加快了开发进度。LoCAlHost在设计上位机软件时需要考虑到pc机速度比单片机速度快的因素,在传送数据时要适当加入延时,以确保系统的正常运行。 四、结语 本文阐述的系统结构和通讯方法已在广西工学院汽车工程系中得到实际应用,取得了良好的效果,具有很好的实用性。 参考文献: [1]范逸之,陈立元.delphi与rs-232串行通讯控制.清华大学出版社. [2]adam4000系列说明书.台湾研华工控.
|