1、串口通信详解一、RS-232RS-232 在 1962 年发布,命名为 EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS-232-C 是美国电子工业协会 EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS 是英文“推荐标准”的缩写,232 为标识号,C 表示修改次数。RS-232-C 总线标准设有 25 条信号线,包括一个主通道和一个辅助通道。在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。RS-232-C 标准规定的数据传输速率为每秒 50、75、 100、15
2、0、300、600、1200、2400、4800、9600、19200 波特。RS-232-C 标准规定,驱动器允许有 2500pF 的电容负载,通信距离将受此电容限制,例如,采用 150pF/m 的通信电缆时,最大通信距离为 15m;若每米电缆的电容量减小,通信距离可以增加。传输距离短的另一原因是 RS-232 属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于 20m 以内的通信。目前 RS-232 是 PC 机与通信工业中应用最广泛的一种串行接口。RS-232 被定义为一种在低速率串行通讯中增加通讯距离的单端标准。RS-232 采取不平衡传输方式,即所谓单端通讯。 图 1
3、收、发端的数据信号是相对于信号地,如从 DTE 设备发出的数据在使用 DB25 连接器时是 2 脚相对 7 脚(信号地)的电平,DB25 各引脚定义参见图 1。典型的 RS-232 信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5+15V,负电平在-5-15V 电平。当无数据传输时,线上为 TTL,从开始传送数据到结束,线上电平从 TTL 电平到RS-232 电平再返回 TTL 电平。接收器典型的工作电平在+3+12V 与-3-12V。由于发送电平与接收电平的差仅为 2V 至 3V 左右,所以其共模抑制能力差,再加上双绞线上的分布电9 针串口(DB9) 25 针串口(DB25
4、)针号 功能说明 缩写针号 功能说明 缩写1 数据载波检测 DCD 8 数据载波检测 DCD2 接收数据 RXD 3 接收数据 RXD3 发送数据 TXD 2 发送数据 TXD4 数据终端准备 DTR 20 数据终端准备 DTR5 信号地 GND 7 信号地 GND6 数据设备准备好 DSR 6 数据准备好 DSR7 请求发送 RTS 4 请求发送 RTS8 清除发送 CTS 5 清除发送 CTS9 振铃指示 DELL 22 振铃指示 DELL容,其传送距离最大为约 15 米,最高速率为 20kb/s。RS-232 是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为 37k。所以
5、RS-232 适合本地设备之间的通信。RS232C 串口通信接线方法(三线制)首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连 同一个串口的接收脚和发送脚直接用线相连 对 9 针串口和 25 针串口,均是 2 与 3直接相连; 两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口)9 针9 针 25 针25 针 9 针25 针2 3 3 2 2 23 2 2 3 3 35 5 7 7 5 7上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收 GPS 数据或电子罗盘数据,只要记住一个原则:
6、接收数据针脚(或线)与发送数据针脚(或线)相连,彼些交叉,信号地对应相接。规定 RS232 RS422 R485工作方式 单端 差分 差分节点数 1 收、1 发 1 发 10 收 1 发 32 收最大传输电缆长度 50 英尺 400 英尺 400 英尺最大传输速率 20Kb/S 10Mb/s 10Mb/s最大驱动输出电压 +/-25V -0.25V+6V -7V+12V驱动器输出信号电平(负载最小值)负载 +/-5V+/-15V +/-2.0V +/-1.5V驱动器输出信号电平(空载最大值)空载 +/-25V +/-6V +/-6V驱动器负载阻抗() 3K7K 100 54摆率(最大值) 30
7、V/s N/A N/A接收器输入电压范围 +/-15V -10V+10V -7V+12V接收器输入门限 +/-3V +/-200mV +/-200mV接收器输入电阻() 3K7K 4K(最小) 12K驱动器共模电压 -3V+3V -1V+3V接收器共模电压 -7V+7V -7V+12V表 1 二、RS485 和 RS422RS-422 由 RS-232 发展而来,它是为弥补 RS-232 之不足而提出的。为改进 RS-232 通信距离短、速率低的缺点,RS-422 定义了一种平衡通信接口,将传输速率提高到 10Mb/s,传输距离延长到 4000 英尺(速率低于 100kb/s 时),并允许在一
8、条平衡总线上连接最多10 个接收器。RS-422 是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A 标准。为扩展应用范围,EIA 又于 1983 年在 RS-422 基础上制定了 RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为 TIA/EIA-485-A 标准。由于 EIA 提出的建议标准都是以“RS”作为前缀,所以在通讯工业领域,仍然习惯将上述标准以 RS 作前缀称谓。 平衡传输 RS-422、RS-485 与 RS-232 不一样,数据信号采用差分传输方式
9、,也称作平衡传输,它使用一对双绞线,将其中一线定义为 A,另一线定义为 B,如图 2。 图 2 通常情况下,发送驱动器 A、B 之间的正电平在+2+6V,是一个逻辑状态,负电平在-26V,是另一个逻辑状态。另有一个信号地 C,在 RS-485 中还有一“使能”端,而在RS-422 中这是可用可不用的。“使能”端是用于控制发送驱动器与传输线的切断与连接。当“使能”端起作用时,发送驱动器处于高阻状态,称作“第三态”,即它是有别于逻辑“1”与“0”的第三态。接收器也作与发送端相对的规定,收、发端通过平衡双绞线将 AA 与 BB 对应相连,当在收端 AB 之间有大于+200mV 的电平时,输出正逻辑电
10、平,小于-200mV 时,输出负逻辑电平。接收器接收平衡线上的电平范围通常在 200mV 至 6V 之间。参见图 3。 图 3 RS-422 电气规定 RS-422 标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。图 5 是典型的 RS-422 四线接口。实际上还有一根信号地线,共 5 根线。图 4 是其 DB9 连接器引脚定义。由于接收器采用高输入阻抗和发送驱动器比 RS232 更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接 10 个节点。即一个主设备(Master),其余为从设备(Salve),从设备之间不能通信,所以 RS-422 支持点对多的双向通
11、信。接收器输入阻抗为 4k,故发端最大负载能力是 104k+100(终接电阻)。RS-422 四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF 握手)或硬件方式(一对单独的双绞线)实现。 图 4 图 5RS-422 的最大传输距离为 4000 英尺(约 1219 米),最大传输速率为 10Mb/s。其平衡双绞线的长度与传输速率成反比,在 100kb/s 速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般 100 米长的双绞线上所能获得的最大传输速率仅为 1Mb/s。 RS-422 需要一终接电
12、阻,要求其阻值约等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一般在 300 米以下不需终接电阻。终接电阻接在传输电缆的最远端。 RS-422 有关电气参数见表 1 RS-485 电气规定 由于 RS-485 是从 RS-422 基础上发展而来的,所以 RS-485 许多电气规定与 RS-422 相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485 可以采用二线与四线方式,二线制可实现真正的多点双向通信,参见图 6。 而采用四线连接时,与 RS-422 一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比 RS-422 有改进, 无论四
13、线还是二线连接方式总线上可多接到 32 个设备。参见图 7。 图 6 图 7RS-485 与 RS-422 的不同还在于其共模输出电压是不同的,RS-485 是-7V 至+12V 之间,而 RS-422 在-7V 至+7V 之间,RS-485 接收器最小输入阻抗为 12k 剑 鳵 S-422 是 4k 健; 旧峡梢运礡 S-485 满足所有 RS-422 的规范,所以 RS-485 的驱动器可以用在 RS-422 网络中应用。 RS-485 有关电气规定参见表 1。 RS-485 与 RS-422 一样,其最大传输距离约为 1219 米,最大传输速率为 10Mb/s。平衡双绞线的长度与传输速率
14、成反比,在 100kb/s 速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般 100 米长双绞线最大传输速率仅为1Mb/s。 RS-485 需要 2 个终接电阻,其阻值要求等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一般在 300 米以下不需终接电阻。终接电阻接在传输总线的两端。 RS-422 与 RS-485 的网络安装注意要点 RS-422 可支持 10 个节点,RS-485 支持 32 个节点,因此多节点构成网络。网络拓扑一般采用终端匹配的总线型结构,不支持环形或星形网络。在构建网络时,应注意如下几点: 1采用一条双绞线电缆作总线,将各个节
15、点串接起来,从总线到每个节点的引出线长度应尽量短,以便使引出线中的反射信号对总线信号的影响最低。图 8 所示为实际应用中常见的一些错误连接方式(a,c,e)和正确的连接方式(b,d,f)。a,c,e 这三种网络连接尽管不正确,在短距离、低速率仍可能正常工作,但随着通信距离的延长或通信速率的提高,其不良影响会越来越严重,主要原因是信号在各支路末端反射后与原信号叠加,会造成信号质量下降。 2应注意总线特性阻抗的连续性,在阻抗不连续点就会发生信号的反射。下列几种情况易产生这种不连续性:总线的不同区段采用了不同电缆,或某一段总线上有过多收发器紧靠在一起安装,再者是过长的分支线引出到总线。总之,应该提供
16、一条单一、连续的信号通道作为总线。 图 8 RS-422 与 RS-485 传输线上匹配的一些说明 对 RS-422 与 RS-485 总线网络一般要使用终接电阻进行匹配。但在短距离与低速率下可以不用考虑终端匹配。那么在什么情况下不用考虑匹配呢?理论上,在每个接收数据信号的中点进行采样时,只要反射信号在开始采样时衰减到足够低就可以不考虑匹配。但这在实际上难以掌握,美国 MAXIM 公司有篇文章提到一条经验性的原则可以用来判断在什么样的数据速率和电缆长度时需要进行匹配:当信号的转换时间(上升或下降时间)超过电信号沿总线单向传输所需时间的 3 倍以上时就可以不加匹配。例如具有限斜率特性的 RS-4
17、85 接口 MAX483 输出信号的上升或下降时间最小为 250ns,典型双绞线上的信号传输速率约为 0.2m/ns(24AWG PVC 电缆),那么只要数据速率在 250kb/s 以内、电缆长度不超过16 米,采用 MAX483 作为 RS-485 接口时就可以不加终端匹配。 一般终端匹配采用终接电阻方法,前文已有提及,RS-422 在总线电缆的远端并接电阻,RS-485 则应在总线电缆的开始和末端都需并接终接电阻。终接电阻一般在 RS-422 网络中取 100,在 RS-485 网络中取 120。相当于电缆特性阻抗的电阻,因为大多数双绞线电缆特性阻抗大约在 100120。这种匹配方法简单有
18、效,但有一个缺点,匹配电阻要消耗较大功率,对于功耗限制比较严格的系统不太适合。 另外一种比较省电的匹配方式是 RC 匹配,如图 9。利用一只电容 C 隔断直流成分可以节省大部分功率。但电容 C 的取值是个难点,需要在功耗和匹配质量间进行折衷。 还有一种采用二极管的匹配方法,如图 10。这种方案虽未实现真正的“匹配”,但它利用二极管的钳位作用能迅速削弱反射信号,达到改善信号质量的目的。节能效果显著。 图 9 图 10RS-422 与 RS-485 的接地问题 电子系统接地是很重要的,但常常被忽视。接地处理不当往往会导致电子系统不能稳定工作甚至危及系统安全。RS-422 与 RS-485 传输网络
19、的接地同样也是很重要的,因为接地系统不合理会影响整个网络的稳定性,尤其是在工作环境比较恶劣和传输距离较远的情况下,对于接地的要求更为严格。否则接口损坏率较高。很多情况下,连接 RS-422、RS-485 通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来。而忽略了信号地的连接,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,这有下面二个原因: 1共模干扰问题:正如前文已述,RS-422 与 RS-485 接口均采用差分方式传输信号方式,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以了。但人们往往忽视了收发器有一定的共模电压范围,如 RS-4
20、22 共模电压范围为-7+7V,而RS-485 收发器共模电压范围为-7+12V,只有满足上述条件,整个网络才能正常工作。当网络线路中共模电压超出此范围时就会影响通信的稳定可靠,甚至损坏接口。以图 11 为例,当发送驱动器 A 向接收器 B 发送数据时,发送驱动器 A 的输出共模电压为 VOS,由于两个系统具有各自独立的接地系统,存在着地电位差 VGPD。那么,接收器输入端的共模电压VCM 就会达到 VCM=VOS+VGPD。RS-422 与 RS-485 标准均规定 VOS3V,但 VGPD 可能会有很大幅度(十几伏甚至数十伏),并可能伴有强干扰信号,致使接收器共模输入 VCM 超出正常范围
21、,并在传输线路上产生干扰电流,轻则影响正常通信,重则损坏通信接口电路。 图 11 2(EMI)问题:发送驱动器输出信号中的共模部分需要一个返回通路,如没有一个低阻的返回通道(信号地),就会以辐射的形式返回源端,整个总线就会像一个巨大的天线向外辐射电磁波。 由于上述原因,RS-422、RS-485 尽管采用差分平衡传输方式,但对整个 RS-422 或RS-485 网络,必须有一条低阻的信号地。一条低阻的信号地将两个接口的工作地连接起来,使共模干扰电压 VGPD 被短路。这条信号地可以是额外的一条线(非屏蔽双绞线),或者是屏蔽双绞线的屏蔽层。这是最通常的接地方法。 值得注意的是,这种做法仅对高阻型
22、共模干扰有效,由于干扰源内阻大,短接后不会形成很大的接地环路电流,对于通信不会有很大影响。当共模干扰源内阻较低时,会在接地线上形成较大的环路电流,影响正常通信。笔者认为,可以采取以下三种措施: (1) 如果干扰源内阻不是非常小,可以在接地线上加限流电阻以限制干扰电流。接地电阻的增加可能会使共模电压升高,但只要控制在适当的范围内就不会影响正常通信。 (2) 采用浮地技术,隔断接地环路。这是较常用也是十分有效的一种方法,当共模干扰内阻很小时上述方法已不能奏效,此时可以考虑将引入干扰的节点(例如处于恶劣的工作环境的现场设备)浮置起来(也就是系统的电路地与机壳或大地隔离),这样就隔断了接地环路,不会形
23、成很大的环路电流。 (3) 采用隔离接口。有些情况下,出于安全或其它方面的考虑,电路地必须与机壳或大地相连,不能悬浮,这时可以采用隔离接口来隔断接地回路,但是仍然应该有一条地线将隔离侧的公共端与其它接口的工作地相连。参见图 12。 图 12 RS-422 与 RS-485 的网络失效保护 RS-422 与 RS-485 标准都规定了接收器门限为200mV。这样规定能够提供比较高的噪声抑制能力,如前文所述,当接收器 A 电平比 B 电平高+200mV 以上时,输出为正逻辑,反之,则输出为负逻辑。但由于第三态的存在,即在主机在发端发完一个信息数据后,将总线置于第三态,即总线空闲时没有任何信号驱动总
24、线,使 AB 之间的电压在-200+200mV直至趋于 0V,这带来了一个问题:接收器输出状态不确定。如果接收机的输出为 0V,网络中从机将把其解释为一个新的启动位,并试图读取后续字节,由于永远不会有停止位,产生一个帧错误结果,不再有设备请求总线,网络陷于瘫痪状态。除上述所述的总线空闲会造成两线电压差低于 200mV 的情况外,开路或短路时也会出现这种情况。故应采取一定的措施避免接收器处于不确定状态。 图 13 通常是在总线上加偏置,当总线空闲或开路时,利用偏置电阻将总线偏置在一个确定的状态(差分电压-200mV)。如图 13。将 A 上拉到地,B 下拉到 5V,电阻的典型值是1k,具体数值随
25、电缆的电容变化而变化。 上述方法是比较经典的方法,但它仍然不能解决总线短路时的问题,有些厂家将接收门限移到-200mV/-50mV,可解决这个问题。例如 Maxim 公司的 MAX3080 系列 RS-485 接口,不仅省去了外部偏置电阻,而且解决了总线短路情况下的失效保护问题。 RS-422 与 RS-485 的瞬态保护 前文提到的信号接地措施,只对低频率的共模干扰有保护作用,对于频率很高的瞬态干扰就无能为力了。由于传输线对高频信号而言就是相当于电感,因此对于高频瞬态干扰,接地线实际等同于开路。这样的瞬态干扰虽然持续时间短暂,但可能会有成百上千伏的电压。 实际应用环境下还是存在高频瞬态干扰的
26、可能。一般在切换大功率感性负载如电机、变压器、继电器等或闪电过程中都会产生幅度很高的瞬态干扰,如果不加以适当防护就会损坏 RS-422 或 RS-485 通信接口。对于这种瞬态干扰可以采用隔离或旁路的方法加以防护。1隔离保护方法。这种方案实际上将瞬态高压转移到隔离接口中的电隔离层上,由于隔离层的高绝缘电阻,不会产生损害性的浪涌电流,起到保护接口的作用。通常采用高频变压器、光耦等元件实现接口的电气隔离,已有器件厂商将所有这些元件集成在一片 IC中,使用起来非常简便,如 Maxim 公司的 MAX1480/MAX1490,隔离电压可达 2500V。这种方案的优点是可以承受高电压、持续时间较长的瞬态
27、干扰,实现起来也比较容易,缺点是成本较高。 2旁路保护方法。这种方案利用瞬态抑制元件(如 TVS、MOV、气体放电管等)将危害性的瞬态能量旁路到大地,优点是成本较低,缺点是保护能力有限,只能保护一定能量以内的瞬态干扰,持续时间不能很长,而且需要有一条良好的连接大地的通道,实现起来比较困难。实际应用中是将上述两种方案结合起来灵活加以运用,如图 14。在这种方法中,隔离接口对大幅度瞬态干扰进行隔离,旁路元件则保护隔离接口不被过高的瞬态电压击穿。常见的 I/O 设备及其与 PC 间的连接方法1、PC-Based 设备常见的 PC-Based 设备及其通讯连接方式见表。常见的 PC-Based 设备及
28、其通讯连接方式生产商产品型号 设备端通讯适配器型号 PC 端通讯适配器型号 通讯方式PC、PCI 总线数据采集和控制卡、PC/104模块、CompactPCI工业控制计算机。RS232/RS422/RS485、以太网RS232/RS422/RS485、以太网采集/控制站与操作站合一时,不使用通讯协议;采集/控制站与操作站不合一时,在采集/控制站上运行嵌入式监控组态软件,通过TCP/IP、CAN等协议与操作站通讯ADAM4000 系列远程数据采集控制模块RS422/RS485 RS422/RS485 ADAM4000 通讯协议研华ADAM5000 系列数据采集控制系统RS232/RS422/RS
29、485/CAN RS232/RS422/RS485/CAN CAN、Modbus等PC、PCI 总线数据采集和控制卡、PC/104模块、CompactPCI、Fama PLC 等工业控制计算机。RS232/RS422/RS485、以太网RS232/RS422/RS485、以太网采集/控制站与操作站合一时,不使用通讯协议;采集/控制站与操作站不合一时,在采集/控制站上运行嵌入式监控组态软件,通过TCP/IP、CAN等协议与操作站通讯。艾讯IDAM7000 系列远程数据采集控制模块RS422/RS485 RS422/RS485 IDAM7000 通讯协议PC、PCI 总线数据采集和控制卡。RS23
30、2/RS485、以太网。 RS232/ RS485、以太网。采集/控制站与操作站合一时,不使用通讯协议;采集/控制站与操作站不合一时,在采集/控制站上运行嵌入式监控组态软件,通过TCP/IP 协议与操作站通讯。康泰克Windows CE BOX 工业控制计算机。RS232/RS485、以太网 RS232/ RS485、以太网。通过 TCP/IP协议与操作站通讯。PC、PCI 总线数据采集和控制卡、PC/104模块、CompactPCI工业控制计算机。RS232/RS422/RS485、以太网。RS232/RS422/RS485、以太网。采集/控制站与操作站合一时,不使用通讯协议;采集/控制站与
31、操作站不合一时,在采集/控制站上运行嵌入式监控组态软件,通过TCP/IP、CAN等协议与操作站通讯。ADAN4000 系列远程数据采集控制模块RS422/RS485 RS422/RS485 ADAN4000 通讯协议研祥ADAN5000 系列数据采集控制系统RS232/RS422/RS485/CAN以太网。RS232/RS422/RS485/CAN/以太网。CAN、Modbus、TCP/IP 等。PC、PCI 总线数据采集和控制卡、PC/104模块、CompactPCI工业控制计算机。RS232/RS422/RS485、以太网。RS232/RS422/RS485、以太网。采集/控制站与操作站合
32、一时,不使用通讯协议;采集/控制站与操作站不合一时,在采集/控制站上运行嵌入式监控组态软件,通过TCP/IP、CAN等协议与操作站通讯。威达牛顿7000、8000系列数据采集控制系统。RS232/RS422/RS485/CAN以太网。RS232/RS422/RS485/CAN/以太网。牛顿 7000 通讯协议2、PLC 设备常见的 PLC 设备及其通讯连接方式见表。常见的 PLC 设备及其通讯连接方式生产商 产品型号 通讯方式CPM1 RS232/RS422CQM1RS232/RS422、COMPOBUS/S、COMPOBUS/DC1000H/C2000HC200HCVMCVCS1RS232/
33、RS422、Controller Link、SYSMAC LINK、SYSNET、Ethernet、CompoBus/s、CompoBus/DOMRONC20H-C60H RS232/RS422FX 系列 RS232/RS422MISTUBISH A 系列Q 系列RS232/RS422/USB、PROFIBUS、Modbus、MELSECNET10、CC-Link、EthernetAllen-BradleyControlLogixPLC5SLC500RS232/RS422、DH+/DH485、ControlNet、Ethernet、DeviceNet松下FP0 /FP1FP3FP10SHRS2
34、32/RS422、Ethernet、MEWNET、C-NETGE FanucLM90-30LM90-70RS-232/422、Ethernet、GENIUS BUS、PROFIBUS、WorldFip、InterBus-snano RS485SchneiderTsx-MICRO RS232/RS422Tsx-PremiumTsx-QuantumTsx-MomentumEthernet、Modbus-Plus、RS232(MODBUS)、WorldFip、InterBus、PROFIBUSS5 PROFIBUSS7-200 PPISiemens S7-300S7-400MPI、PROFIBUS、
35、Ethernet3、智能指示、控制仪表及控制器目前国内外的智能仪表厂商有数千家,产品种类繁多,难以归纳,其中数字指示仪、单(多)回路调节器、流量积算仪、智能终端、楼宇自控设备所占比重较大,这里不一一列举。这些仪表与计算机间的通讯方式以 RS485 居多,但越来越多的产品会增加现场总线的通讯接口,智能控制器、楼宇自控设备使用现场总线的较多(如 LonWorks、C-Bus 等)。在这方面较有影响的厂商有霍尼韦尔、横河、富士电机、山武、欧陆、慕尔、ABB、HDCB dob;m_hIDComDev=CreateFile(szPort, GENERIC_READGENERIC_WRITE,O,NULL
36、,OPEN_EXISTING,FILE_ATTRIBUTE_NORMALFILE_FLAG_OVERLAPPED,NULL);dcb.DCB1ength=sizeof(DCB);GetCommState(m_hIDComDev,/取得通讯资源当前设置dcb.BaudRate=9600;/设定波特率为 9600dcb.ByteSize=7;/7 数据位dcb.Parity=2;/偶校验dcb.StopBits=0;/设定 1 个停止位if(SetCommState(m_hIDComDev,else return(FALSE);/设置端口,若设置成功则返回 TRUE,否则返回 FALSE需要说明的
37、是 CSerial 是一个用于串行通讯的类,它包含了进行串行通讯的所需的函数。除上述端口初始化成员函数 Open 外,还包括另两个重要成员函数:一个是endData,把数据从一个缓冲区发送到串行端口。另一个是 ReadData,从端口的接收缓冲区中读入数据。其次,在每进行一次上述四类操作中的一种操作以前,还要进行握手联络。对PLC 发请求讯号 ENQ(代码为 OX05),然后读 PLC 的响应讯号。如果读到的响应讯号为ACK(代码为 OX06),则表示 PLC 已准备就绪,等待接收通讯数据。握手联络 VC 语言示PLC 已准备就绪,等待接收通讯数据。握手联络 VC 语言实现为:BOOL CNT
38、JD1g:ReadFromPLC(char *Read_char char *Read_address,int Read_bytes)CSerial Serial;/用于串行通讯的类char read_BUFFER;if(Serial.Open(2)/初始化串行口通讯口 COM2 Serial.SendData(/发送联络讯号Sleep(1000);/等待 1 秒钟Serial.ReadData(/读取 PLC 响应讯号if(read_BUFFER=ACK) 如果 PLC 响应讯号等于 ACK,则进行上述四种操作:Serial.Close():/操作完毕后,关闭通讯口编程口命令操作(1)位元件
39、或字元件状态读操作操作对象元件:PLC 内部的 X、Y、M、S、T、C、D 元件;命令格式:说明:为读命令起始标志 STX,代码为 OX02;为位元件或字元件状态读命令 CMDO,命令代码为 OX30;为读位元件或字元件的 4 位起始地址,高位先发,低位后发,且是以 ASCII 码的形式发送;为一次读取位元件或字元件的个数,最多一次可读取 OXff 个字节的元件,以ASCII 码的形式发送;为停止位标志 ETX,代码为 OX03;为 2 位和校验,和累计为、项代码,取其和最低两位转化成 ASCII 码,高位先发,低位后发。在发送完上述命令格式代码后,就可直接读取 PLC 响应的信息。响应信息格
40、式如下:VC 语言实现:BOOL CNTJDlg:ReadFromPLC(char *Read_char char*Read_address, int Read_bytes)char senddatasum_CHECK2;char readdatasum_CHECK2; char total_DATABYTES2;char readdatasum_check2;int readdata_sum;int datasum_check=0; int i;Serial.SendData(/向 PLC 发送“开始”标志代码Serial.SendData(/发送“读”命令代码 datasum_check+
41、=CMDO_read;for(i=0;i4;i+)Serial.SendData(/发送起始元件地址的ASCII 代码 datasum_check+=Read_addressi;Change to ASCII(total DATABYTES,Read_bytes);/将字节数转化成 ASCII 代码for (i=0;i2;i+)Serial.SendData(/发送元件字节数的 ASCII 代码)datasum_check+total_DATABYTESi;Serial.SendData(/发送“结束”标志代码senddatasum_CHECK+ETX_end;Change_to_ASCII(
42、senddatasum_CHECK,senddatasum_CHECK);/将“和”转化成 ASCII码for (i=0;i2;i+) Serial.SendData(Sleep(1000);/等待 PLC 响应Serial.ReadData(if(read_BUFFER=STX_start)readdata_sum=0;for(i=0;i2*Read_bytes;i+)Serial.ReadData(/读Read_bytes 个字节 readdata_sum+Read_chari;Serial.ReadData(if(read_BUFFER=ETX_end)Serial.ReadData(r
43、eaddatasum_CHECK,2);/读入的“和”的低 2 位 ASCII 码 Readdata_sum+=ETX_end;Change_to_ASCII(readdatasum_check,readdata_sum);/将计算得到的“和”转化成 ASCII 码if(*readdatasum_CHECK=*readdatasum_check)/“和”校验 AfxMessageBox(“数据读出成功!”)return TRUE;else AfxMessageBox(“校验错误”)return FALSE.(2)位元件或字元件状态写操作操作对象元件:同 3(1);命令格式:说明:为写命令起始标
44、志 STX,代码为 OX02;为位元件或字元件状态写命令 CMD1,命令代码为 OX31;为写位元件或字元件的 4 位起始地址,高位先发,低位后发,且是以 ASCII 码的形式发送;为一次写入位元件或字元件的个数,以 ASCII 码的形式发送;为待写到 PLC RAM 区的数据 DATA,以 ASCII 码形式发送;为停止位标志 ETX,代码为 OX03;为 2 位和校验,和累计为、项代码,取其和最低两位转化成 ASCII 码,高位先发,低位后发。VC 语言实现:BOOL CNTJDlg:WritePLC(char *data_ADDRESS,char *Write_ASC,int bytes
45、number)char total_BYTES2;char senddatasum_CHECK2;char read_BUFFER;char read_finishBUFFER;int datasum_check=0; int i=0;Serial.SendData(/向 PLC 发送“开始”标志代码datasum_check=0;Serial.SendData(/发送“写”命令代码datasum_check+CMD1_write;for(i=0;i4;i+) Serial.SendData(/发送起始元件地址的 ASCII 码datasum_check+=data_ADDRESSi;Chan
46、ge_to_ASCII(total_DATABYTES,bytesnumber);/将字节数转化成 ASCII 码for(i=0;i2;i+)Serial.SendData(/发送元件字节数的 ASCII 代码datasum_check+=total_BYTESi;for i=0;ibytesnumber*2;i+)Serial.SendData(/发送要写入的数据的 ASCII 码datasum_check+=Write_ASCi;Serial.SendData(/发送“结束”标志代码datasum_check+=ETX_end;Change_to_ASCII(senddatasum_CHE
47、CK,datasum_check);/将“和”转化成 ASCII 码Serial.SendData(Sleep(1000); Serial.ReadData(if (read_finishBUFFER=ACK_reply)AfxMessageBox(“数据写入 OK”)return TRUE;else AfxMessageBox(“数据写入失败”)return FALSE。(3)位元件强制 ON 操作操作对象:X、Y、M、S、T、C 元件;命令格式:说明:为强制 ON 命令起始标志 STX,代码为 OX02;为强制 ON 命令 CMD7,命令代码为 OX37;为强制 ON 位元件 4 位起始地
48、址,高位先发,低位后发,是以 ASCII 码形式发送;为停止位标志 ETX, 代码为 OX03;为 2 位和校验,和累计为、项代码,取其和低两位转化成 ASCII 码,高位先发,低位后发。VC 语言实现:void NTJDlg:ForceOnOperation (char *ON_Address) int i;charsyn_Check2;char read_buffer;int Sum=0;Serial.SendData(/向 PLC 发送“开始”标志代码Serial.SendData(/发送“ON”命令代码Sum+=CMD7 ForceON;for (i=0; i4; i+) Serial
49、.SendData(Serial.SendData(/发送“结束”标志代码 Sum+=ETX_end;Change_to_ASCII(Sum_Check,Sum);/将“和”转化成 ASCII 码Serial.SendData(Sleep(1000);Serial.ReadData(if(read_finishBUFFER=ACK_reply) AfxMessageBox(“ON 操作 OK”);else AfxMessageBox(“ON 操作失败”)。(4)位元件强制 OFF 操作操作对象 L 同 3(3);命令格式:说明:为强制 OFF 命令起始标志 STX,代码为 OX02;为强制 OFF 命令 CMD8,命令代码为 OX38H;为强制 OFF 位元件 4 位起始地址,高位先发,低位后发,以