VB1

更新时间:2023-07-19 23:56:57 阅读: 评论:0

RS-422口或RS-232C口进行的,信息交换的方式为字符串方式,运用RS-232CRS-422通道,容易配置一个与计算机进行通信的系统,将所有软元件的数据和状态用可编程控制器送入计算机,由计算机采集这些数据,进行分析及运行状态监测。用计算机改变可编程控制器设备的初始值和设定值,从而实现计算机与可编程控制器的直接控制,一旦确定了可编程控制器的控制指令,就能很方便地与计算机连接。 



2  S7-200的自由口通讯模式

S7-200支持多种通讯模式,如点点接口(PPI)、多点接口(MPI)Rrofibus DP等。PPI等通讯协议主要用于西门子系列产品之间的通讯以及对PLC编程。在自由口模式下,可由用户控制串行通讯接口,实现用户自定义的通讯协议。用户可以用梯形图程序调用接收中断、发送中断、发送指令(XMT)、接受指令(RCV)来控制通信操作。在自由口模式下,通信协议完全由梯形图程序控制。


S7-200CPU上的通信口是与RS-485兼容的9D型连接器,PLC还提供了实现 RS-485 PC机上RS-232C相连接的PC/PPI电缆,利用它可以方便地实现S7-200系列PLCPC之间的硬件连接。

S7-200的编程软件为STEP7-Micro/WIN32,该软件有STLFBDLadder三种编程模式,有SIMATIC指令和IEC131-3指令两种指令。本文所给出的范例是使用SIMATIC指令的STL编程。



3  S7-200 PLC端的通讯程序实现

PLC程序分为主程序和中断程序。主程序完成初始化通信口、开中断、判断、发送数据等功能,中断程序完成接收和发送数据的功能。接收指令(RCV)启动或终止接收信息功能,必
须为接收操作指定开始和结束条件。发送指令(XMT)在自由口模式下依靠通讯口发送数据。

3.1  控制字的选取

反映CPU工作方式的模式开关当前位置的特殊存储器位为SM0.7,它控制自由端口模式的进入。当SM0.70时,模式开关处于TREM位置;SM0.71时模式开关处于RUN位置。而只有当模式开关位于RUN位置时,才允许进行自由口通讯。SMB30是自由口模式控制字节,用来设定校验方式、通讯协议、波特率等通讯参数(其它控制字的设定参阅有关书籍)

3.2  程序的一些简单介绍

NETWORK1

LD  SM0.1   // 第一次扫描

MOVB  16#09SMB30 

//自由口通讯模式:9600波特率,无奇偶校验,8个数据位

MOVB  16#7CSMB87 //接收信息状态字节

MOVB  16#53SMB88 

//设置信息的开始字符“S”

MOVB  16#45SMB89 

//设置信息的结束字符“E”


MOVW  +5SMW90   

//设定空闲行的时间间隔(ms)

MOVW  +179SMW92 

//字符间/信息间定时器超时值(ms)

MOVB  60SMB94  //接收字符的个数

NETWORK2

LD  SM0.1 MOVB 16#53VB2499 

/
/设置接收和发送缓冲区的首地址

ATCH  发送完中断,9     

//把发送完成中断和发送完成中断子程序连接起来

ATCH  接收完中断,23   

//把接收完成中断和接收完成中断子程序连接起来

ENI    //允许中断

PLC程序的主要流程框图如图1所示:












1     PLC程序流程自由口通讯在PC 端程序实现

为了充分利用计算机数据处理的强大功能,可以在上位机编写程序来实现计算机与PLC的通讯。可以用VCVB实现上位机和PLC的通讯。

4.1  利用VC6.0 VC6.0 MSComm控件实现


MSComm控件Microsoft公司提供的简化的Windows下串行通讯编程的ActiveX控件,它为应用程序提供了通过串口收发数据的简便方法。PC机通过RS-232口与PLC进行通信,该通信控件提供了使用RS-232开发串行通信软件的细则,使用事件驱动或查询方式来解决开发通信软件中遇到的问题。事件驱动是一种强大的处理问题的方法,对事件发生的跟踪和处理在通信软件中用Oncomm来实现,它包括检测和处理通信错误等;查询方式则要求设计者自行读取CommEven值,并判断发生何种事件,再对之进行处理。该控件有许多重要的属性,主要的属性如附表所示。 





附表     MSComm属性












开发通信软件只需上述几个重要属性设置好通信口,然后用SetOutput指令发送命令。按照通信协议,待PC机与PLC握手成功后,可按特定的数据格式通过GetInputSetOutput来接收或发送数据。 

4.2  利用VC6.0 CSerialPorts类实现


如果在程序中使用多个串口,而且还要做很复杂的处理工作,那么最好不用MSComm控件。如果这时候不愿意自己编写底层函数,就可以使用CSerial Ports类。

这个类是由Remon编写的。其中详细的功能可以在其网站上查询。

SerialPort.h  SerialPort.cpp两个类文件复制到工程文件夹中,用 Project -> Add to project -> Files命令将上述两个文件加入工程。

串口的初始化:

在这种方式下,串口的初始化通常放在一个自定义的函数中,这样可以使用多不同的端口,下面以初始化COM的为例给出部分代码。

void CtestView::OpenCom2()


{   DCB dc;

dc.DCBlength = sizeof(DCB);

dc.BaudRate = CBR_9600; 

学做煎饼//数据传输速率为9600

dc.ByteSize = 8;   

//8位数据位

dc.StopBits = ONESTOPBIT;   

/
/1位停止位

dc.Parity = NOPARITY; 

//无校验

}     

其中DCB(设备控制块)是一种数据结构,用以实现串口属性的设置。

数据的接收和发送:

数据接收是调用了ReadByte函数,每次读取一个BYTE型变量,多个数据的读取可以通过循环实现。数据发送是调用WriteByte函数,每次只能发送一个无符号的char型或者与之等价的数据,多个数据可以通过循环实现。


4.3  利用PCommPro应用软件实现

PLC通讯时,PC机还可采用的PCommPro应用软件,该软件是通过Win32初级API函数的调用来控制和使用通讯端口。与VB/VC中的MComm控件相比较,使用较复杂些,但通讯效率高输出控制较好。

在程序中PC机接收数据采用回调函数的处理方式,即欲建立事件,需给定一个函数的地址,当事件发生时,Pcomm便到该回调函数所在的地址去执行该程序代码。所谓回调函数是指当调用一个函数时(尤其是API),该函数会要求调用者提供一个函数的地址,当被调用函数执行后,会再去调用此函数,目的是将结果传送回来让用户知道,或是该被调用函数需要另一个参考的函数运算等,这种做法就称为回调。Pcomm中的回调函数主要介绍以下几种。

Sio_term_irq:当收到终止字符时引发事件程序;


Sio_cnt_irq:接收到固定字符时引发事件;

Sio_modem_irq:当硬件线路的电压发生变化时,引发事件,硬件线路包括DCDDSRCTSRI4支管脚;

Sio_break_irq:当接到中断信号时引发事件。

在程序设计中要根据具体的情况来选择不同的回调函数。例:数据以ASCII值形式传递时,可以使用Sio_term_irq函数,即当收到终止字符时引发事件程序,也可以使用其它回调函数。但当传递的数据以字节形式表示时,使用Sio_term_irq函数可能会引发一些问题,是因为传递的数据值可能与函数所设置的终止字符相同,可能造成接收数据的不完整。 














2     PC的主要程序流程框图

应用到的其它函数还有如下:

sio_open():打开通信端口;


sio_ioctl():设置传输的端口参数,给定的参数有三个,有端口号码、波特率和参数模式(由数据位、停止位和奇偶检验位3部分组成);

sio_read():从接收缓冲区中读取字符串;

sio_write():把发送缓冲区中的数据发送出去;

sio_clo():关闭通讯端口,此操作会导致所有的接收和传送操作都停止。

PC程序的主要流程框图如图2所示。

 

结束语


S7-200的自由口通讯方式,使用户可以通过PLC指令自己定义通讯协议,从而与任何公开通讯协议的RS-422RS-232C接口设备进行通讯,使通讯范围大为增加,控制系统配制更加灵活。随着计算机的普及,人们更希望在享受PLC高性能控制功能的同时,利用个人计算机大量丰富的软件,将PLC的信息转换成各类画面显示,并可以对PLC的参数进行实时修改,达到管理、控制一体化、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
vb串口通信控件-mscomm
2008-07-08 17:19
MSComm控件提供了两种处理通信的方式:一种为事件驱动方式,该方式相当于一般程序设计中的中断方式。当串口发生事件或错误时,MSComm控件会产生OnComm事件,用户程序可以捕获该事件进行相应处理。本文的两个例子均采用该方式。另一种为查询方式,在用户程序中设计定时或不定时查询 MSComm控件的某些属性是否发生变化,从而确定相应处理。在程序空闲时间较多时可以采用该方式。
常用属性和方法
利用MSComm控件实现计算机通信的关键是理解并正确设置MSComm控件众多属性和方法。以下是MSComm控件的常用属性和方法:
Commport:设置或返回串口号。
Settings:以字符串的形式设置或返回串口通信参数。
Portopen:设置或返回串口状态。
InputMode:设置或返回接收数据的类型。
Inputlen:设置或返回一次从接收缓冲区中读取字节数。
InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。
InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。
Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。
OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。
OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。
Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。
Rthreshold:该属性为一阀值。当接收缓冲区中字符数达到该值时,MSComm控件设置Commevent属性为ComEvReceive,并产生OnComm事件。用户可在OnComm事件处理程序中进行相应处理。若Rthreshold属性设置为0,则不产生OnComm事件。例如用户希望接收缓冲区中达到一个字符就接收一个字符,可将Rthreshold设置为1。这样接收缓冲区中接收到一个字符,就产生一次OnComm事件。
Sthreshold:该属性亦为一阀值。当发送缓冲区中字符数小于该值时,MSComm控件设置Commevent属性为ComEvSend,并产生 OnComm事件。若Sthreshold属性设置为0,则不产生OnComm事件。要特别注意的是仅当发送缓冲区中字符数小于该值的瞬间才产生 OnComm事件,其后就不再产生OnComm事件。例如Sthreshold设置为3,仅当发送缓冲区中字符数从3降为2时,MSComm控件设置 Commevent属性为ComEvSend,同时产生OnComm事件,如发送缓冲区中字符始终为2,则不会再产生OnComm事件。这就避免了发送缓冲区中数据未发送完就反复发生OnComm事件。
CommEvent:这是一个非常重要的属性。该属性设计时无效,运行时只读。一旦串口发生通信事件或产生错误,依据产生的事件和错误,MSComm控件为CommEvent属性赋不同的代码,同时产生OnComm事件。用户程序就可在OnComm事件处理程序中针对不同的代码,进行相应的处理。 CommEvent属性的代码、常数及含义参见表1及表2
1 CommEvent通信事件 代码 常数 含义
1 ComEvReceive 接受到Rthreshold个字符。该事件将持续产生,直到用Input属性从接受缓冲区中读取并删除字符。
2 ComEvSend 发送缓冲区中数据少于Sthreshold个,说明串口已经发送了一些数据,程序可以用Output属性继续发送数据。
3 ComEvCTS Clear To Send信号线状态发生变化。
4 ComEvDSR Data Set Ready信号线状态从1变到0
5 ComEvCD Carrier Detect信号线状态发生变化。
6 ComEvRing 检测到振铃信号。
7 ComEvEOF 接受到文件结束符。

2 CommEvent通信错误 代码 常数 含义
1001 ComEvntBreak 接受到一个中断信号。
1002 ComEvntCTSTO Clear To Send信号超时。
1003 ComEvntDSRTO Data Set Ready信号超时。
1004 ComEvntFrame 帧错误。
1006 ComEvntOverrun 串口超速。
1007 ComEvntCDTO 载波检测超时。
1008 ComEvntRxOver 接受缓冲区溢出,缓冲区中已没有空间。
1009 ComEvntRxParity 奇偶校验错。
1010 ComEvntTxFull 发送缓冲区溢出,缓冲区中已没有空间。
1011 ComEvntDCB 检索串口的设备控制块时发生错误。
实例1:计算机拨号
在一些实际应用中经常需要使用计算机拨号。下面这个例子利用MSComm控件操作Modem进行拨号,实现串口通信。
实现步骤:
1.建窗体
●添加一个MSComm控件,用来建立与串口的连接;
●添加一个Text控件,Name属性为Txttel,用来输入电话号码;
●添加3CommandButton控件,Name属性分别为DialButtonCancellButtonQuitButton,分别用来实现拨号、中止拨号、中止程序;
●添加一个Label控件,用来显示所有与拨号有关的信息。窗体见图1
2.设置MSComm控件属性
InBufferSize=1024
Inputlen=0
InputMode=0
Rthreshold=2
RTSEnable=True
Settings=9600,N,8,1”;
Sthreshold=0
因为每一台计算机的串口使用状态都不会一样。为使程序具有通用性,在窗体的Load方法中首先进行串口测试,找到第一个可用串口后再进行设置。
CommPort属性 设置并返回通讯端口号。
语法 object.CommPort[value ] (value 一整型值,说明端口号。)
说明 在设计时,value 可以设置成从 1 16 的任何数(缺省值为 1)。但是如果用 PortOpen 属性打开一个并不存在的端口时,MSComm 控件会产生错误 68(设备无效)。
注意:必须在打开端口之前设置短语英文 CommPort 属性。
RThreshold 属性:在 MSComm 控件设置 CommEvent 属性为 comEvReceive 并产生 OnComm 之前,设置并返回的要接收的字符数。
语法 object.Rthreshold [ = value ]value 整型表达式,说明在产生 OnComm 事件之前要接收的字符数。
说明 当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。例如,设置 Rthreshold 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。
CTSHolding 属性:确定是否可通过查询 Clear To Send (CTS) 线的状态发送数据。Clear To Send 是调制解调器发送到相联计算机的信号,指示传输可以进行。该属性在设计时无效,在运行时为只读。
语法: object.CTSHoldingBoolean
Mscomm 控件的 CTSHolding 属性设置值:
True Clear To Send 线为高电平。
Fal Clear To Send 线为低电平。
说明:如果 Clear To Send 线为低电平 (CTSHolding = Fal) 并且超时时,MSComm 控件设置 CommEvent 属性为 comEventCTSTO (Clear To Send Timeout) 并产生 OnComm 事件。
Clear To Send 线用于 RTS/CTS (Request To Send/Clear To Send) 硬件握手。如果需要确定 Clear To Send 线的状态,CTSHolding 属性给出一种手工查询的方法。
详细信息 有关握手协议,请参阅 Handshaking 属性。
SThreshold 属性: MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。
语法 object.SThreshold [ = value ]
value 整形表达式,代表在白吐司 OnComm 事件产生之前在传输缓冲区中的最小字符数。
说明:若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。如果在传输缓冲区中的字符数小于 valueCommEvent 属性设置为 comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。

Handshake 常数
常数 描述
comNone 0 无握手。
comXonXoff 1 XOn/Xoff 握手。
comRTS 2 Request-to-nd/clear-to-nd 握手。
comRTSXOnXOff 3 Request-to-nd clear-to-nd 握手皆可。

OnComm 常数
常数 描述
comEvSend 1 发送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-nd 线变化。
comEvDSR 4 data-t ready 线变化。
comEvCD 5 carrier detect 线变化。
comEvRing 6 振铃检测。
comEvEOF 7 文件结束。

Error 常数
常数 描述
comEventBreak 1001 接收到中断信号
comEventCTSTO 1002 Clear-to-nd 超时
comEventDSRTO 1003 Data-t ready 超时
comEventFrame 1004 帧错误
comEventOverrun 1006 端口超速
comEventCDTO 1007 Carrier detect 超时
comEventRxOver 1008 接收缓冲区溢出
comEventRxParity 1009 Parity 错误
comEventTxFull 1010 传输缓冲区满
comEventDCB 1011 检索端口 设备控制块 (DCB) 时的意外错误
InputMode 常数
常数 描述
comInputModeText 0 (缺省)通过 Input 属性以文本方式取回数据。
comInputModeBinary 1 通过 Input 属性以二进制方式检取回数据。
副词修饰名词
CDHolding 属性:通过查询 Carrier Detect (CD) 线的状态确定当前是否有传输。Carrier Detect 是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。该属性在设计时无效,在运行时为只读。
语法 object.CDHolding
设置值:CDHolding 属性的设置值为:
设置 描述
True Carrier Detect 线为高电平
Fal Carrier Detect 线为低电平
说明:注意当 Carrier Detect 线为高电平 (CDHolding = True) 且超时时,MSComm 控件设置CommEvent 属性为 comEventCDTOCarrier Detect 超时错误),并产生 OnComm 事件。
注意 在主机应用程序中捕获一个丢失的传输是特别重要的,例如一个公告板,因为呼叫者可以随时挂起(放弃传输)。
Carrier Detect 也被称为 Receive Line Signal Detect (RLSD)
数据类型 Boolean
DSRHolding 属性:确定 Data Set Ready (DSR) 线的状态。Data Set Ready 信号由调制解调器发送到相连计算机,指示作好操作准备。该属性在设计时无效,在运行时为只读。
语法:object.DSRHolding
object 所在处表示对象表达式,其值是应用于列表中的对象。
DSRHolding 属性返回以下值:
描述
True Data Set Ready 线高
Fal Data Set Ready 线低
说明:当 Data Set Ready 线为高电平 (DSRHolding = True) 且超时时,MSComm 控件设置 CommEvent 属性为 comEventDSRTO(数据准备超时)并产生 OnComm 事件。
当为 Data Terminal Equipment (DTE) 机器写 Data Set Ready/Data Terminal Ready 握手例程时该属性是十分有用的。
数据类型:Boolean

Settings 属性: 设置并返回波特率、奇偶校验、数据位、停止位参数。
语法: object.Settings[ = value]
说明:当端口打开时,如果 value 非法,则 MSComm 控件产生错误 380(非法属性值)。
Value 由四个设置值组成,有如下的格式:
"BBBB,P,D,S"
BBBB 为波特率,P 肉做法为奇偶校验,D 为数据位数,S 为停止位数。value 的缺省值是:
"9600,N,8,1"

InputLen 属性:设置并返回 Input 属性从接收缓冲区读取的字符数。
语法 object.InputLen [ = value]
InputLen 属性语法包括下列部分:
value 整型表达式,说明 Input 属性从接收缓冲区中读取的字符数。
说明:InputLen 属性的缺省值是 0。设置 InputLen 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
若接收缓冲区中 InputLen 字符无效,Input 属性返回一个零长度字符串 ("")。在使用 Input 前,用户可以选择检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。

EOFEnable 属性:确定在输入过程中 MSComm 控件是否寻找文件结尾 (EOF) 字符。如果找到 EOF 字符,将停止输入并激活 OnComm 事件,此时 CommEvent 属性设置为 comEvEOF
语法:object.EOFEnable [ = value ]
EOFEnable 属性语法包括下列部分:
value 布尔表达式,确定当找到 EOF 字符时,OnComm 事件是否被激活,如设置值中所描述。
value 的设置值:
True EOF 字符找到时 OnComm 事件被激活。
Fal (缺省)当 EOF 字符找到时 OnComm 事件不被激活。
说明:当 EOFEnable 属性设置为 FalOnComm 控件将不在输入流中寻找 EOF 字符。

错误消息(MS Comm 控件)

下表列出 MSComm 控件可以捕获的错误:
描述
380 无效属性值 comInvalidPropertyValue
383 属性为只读 comSetNotSupported
394 属性为只读 comGetNotSupported
8000 端口打开时操作不合法 comPortOpen
8001 超时值必须大于 0
8002 无效端口号 comPortInvalid
8003 属性只在运行时有效
8004 属性在运行时为只读
8005 端口已经打开 comPortAlreadyOpen
8006 设备标识符无效或不支持该标识符
8007 不支持设备的波特率
8008 指定的字节大小无效
8009 缺省参数错误
8010 硬件不可用(被其它设备锁定)
8011 函数不能分配队列
8012 设备没有打开 comNoOpen
8013 设备已经打开
8014 不能使用 comm 通知
8015 不能设置 comm 状态 comSetCommStateFailed
8016 不能设置 comm 事件屏蔽
8018 仅当端口打开时操作才有效 comPortNotOpen
8019 设备忙
8020 comm 设备错误 comReadError
8021 为该端口检索设备控制块时的内部错误 comDCBError
MODBUS-RTU通讯协议简介
2008-10-10 17:27
1.1 Modbus协议简述
ACRXXXE系列仪表使用的是Modbus-RTU通讯协议,MODBUS协议详细定义了校验码、数据序列等,这些都是特定数据交换的必要内容。MODBUS协议在一根通讯线上使用主从应答式连接(半双工),这意味着在一根单独的通讯线上信号沿着相反的两个方向传输。首先,主计算机的信号寻址到一台唯一的终端设备(从机),然后,终端设备发出的应答信号以相反的方向传输给主机。
Modbus协议只允许在主机(PCPLC等)和终端设备之间通讯,而不允许独立的终端设备之间的数据交换,这样各终端设备不会在它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。
1.2 查询回应周期
1.2.1 查询
查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。
1.2.2 回应
如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:如寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。
1.3 传输方式
传输方式是指一个数据帧内一系列独立的数据结构以及用于传输数据的有限规则,下面定义了与Modbus 协议– RTU方式相兼容的传输方式。
每个字节的位:
·    1个起始位
·    8个数据位,最小的有效位先发送
·日本推理小说    无奇偶校验位
·    1个停止位
错误检测(Error checking)CRC(循环冗余校验)
1.4 协议
当数据帧到达终端设备时,它通过一个简单的端口进入被寻址到的设备,该设备去掉数据帧的信封(数据头),读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据加入到取得的信封中,把数据帧返回给发送者。返回的响应数据中包含了以下内容:终端从机地址(Address)、被执行了的命令(Function)、执行命令生成的被请求数据(Data)和一个校验码(Check)。发生任何错误都不会有成功的响应,或者返回一个错误指示帧。
1.4.1 数据帧格式
Address      Function      Data          Check 
8-Bits        8-Bits      N x 8-Bits      16-Bits 
1.4.2 地址(Address)域
地址域在帧的开始部分,由一个字节(8位二进制码)组成,十进制为0255,在我们的系统中只使用1~247,其它地址保留。这些位标明了用户指定的终端设备的地址,该设备将接收来自与之相连的主机数据。每个终端设备的地址必须是唯一的,仅仅被寻址到的终端会响应包含了该地址的查询。当终端发送回一个响应,响应中的从机地址数据便告诉了主机哪台终端正与之进行通信。
1.4.3 功能(Function)域
功能域代码告诉了被寻址到的终端执行何种功能。下表列出了该系列仪表用到的功能码,以及它们的意义和功能。
代码    意义                    行为 
03    读数据寄存器    获得一个或多个寄存器的当前二进制值
16    预置多寄存器    设定二进制值到一系列多寄存器中(不对 ACRXXXE开放
1.4.4 数据(Data)
数据域包含了终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。这些数据的内容可能是数值、参考地址或者设置值。例如:功能域码告诉终端读取一个寄存器,数据域则需要指明从哪个寄存器开始及读取多少个数据,内嵌的地址和数据依照类型和从机之间的不同内容而有所不同。
1.4.5 错误校验(Check)
该域允许主机和终端检查传输过程中的错误。有时,由于电噪声和其它干扰,一组数据在从一个设备传输到另一个设备时在线路上可能会发生一些改变,出错校验能够保证主机或者终端不去响应那些传输过程中发生了改变的数据,这就提高了系统的安全性和效率,错误校验使用了16位循环冗余的方法(CRC16)。

1.5 错误检测的方法
错误校验(CRC)域占用两个字节,包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。
CRC运算时,首先将一个16位的寄存器预置为全1,然后连续把数据帧中的每个字节中的8位与该寄存器的当前值进行运算,仅仅每个字节的8个数据位参与生成CRC,起始位和终止位以及可能使用的奇偶位都不影响CRC。在生成CRC时,每个字节的8位与寄存器中的内容进行异或,然后将结果向低位移位,高位则用0补充,最低位(LSB)移出并检测,如果是1,该寄存器就与一个预设的固定值(0A001H)进行一次异或运算,如果最低位为0,不作任何处理。
上述处理重复进行,直到执行完了8次移位操作,当最后一位(第8位)移完以后,下一个8位字节与寄存器的当前值进行异或运算,同样进行上述的另一个8次移位异或操作,当数据帧中的所有字节都作了处理,生成的最终值就是CRC值。
生成一个CRC的流程为:
1    预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。
2    把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。
3    CRC寄存器向右移一位,最高位填以0,最低位移出并检测。
4    如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。
5    重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。
6    重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。
7    最终CRC寄存器的值就是CRC的值。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
MODBUS通讯协议
2008-10-10 10:25
ModBus通讯协议分为RTU协议和ASCII协议。下面就ModBus RTU协议简要介绍如下:
一、通讯协议
(一)、通讯传送方式:
  通讯传送分为独立的信息头,和发送的编码数据。以下的通讯传送方式定义也与MODBUS RTU通讯规约相兼容:
8位二进制
起始位 1
数据位 8
奇偶校验位 1位(偶校验位)
停止位 1
错误校检 CRC(冗余循环码)
初始结构 = 4字节的时间
地址码 = 1 字节
功能码 = 1 字节
数据区 = N 字节
错误校检 = 16CRC
结束结构 = 4字节的时间
  地址码:地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。
  功能码:通讯传送的第二个字节。ModBus通讯规约定义功能号为1127。本仪表只利用其中的一部分功能码。作为主机请求发送,通过功能码告诉从机执行什么动作。作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。如果从机发送的功能码的最高位为1(比如功能码大与此同时127),则表明从机没有响应操作或发送出错。
  数据区:数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。
  CRC码:二字节的错误检测码。
(二)、通讯规约:
  当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就不发送任何信息。
1.信息帧结构
地址码 功能码 数据区 错误校验码
8 8 N × 8 16
  地址码:地址码是信息帧的第一字节(8),从0255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送。当从机回送信息时,相当的地址码表明该信息来自于何处。
  功能码:主机发送的功能码告诉从机执行什么任务。表1-1列出的功能码都有具体的含义及操作。
代码 含义 操作
03 读取数据 读取当前寄存器内一个或多个二进制值
06 重置单一寄存器 把设置的二进制值写入单一寄存器
  数据区:数据区包含需要从机执行什么动作或由从机采集的返送信息。这些信息可以是数值、参考地址等等。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。
  错误校验码:主机或从机可用校验码进行判别接收信息是否出错。有时,由于电子噪声或其它一些干扰,信息在传输过程中会发生细微的变化,错误校验码保证了主机或从机对在传送过程中出错的信息不起作用。这样增加了系统的安全和效率。错误校验采用CRC-16校验方法。
注:信息帧的格式都基本相同:地址码、功能码、数据区和错误校验码。
2.错误校验
  冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信息的 CRC码,比较计算得到的CRC码是否与接收到的相符,如果两者不相符,则表明出错。
  CRC码的计算方法是,先预置16位寄存器全为1。再逐步把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。
  在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一字节,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。
  这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相相异或,这个过程与以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。CRC码中的数据发送、接收时低字节在前。
  计算CRC码的步骤为:
预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;
把第一个8位数据与16CRC寄存器的低位相异或,把结果放于CRC寄存器;
把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
如果最低位为0:重复第3(再次移位); 如果最低位为1CRC寄存器与多项式A0011010 0000 0000 0001)进行异或;
重复步骤34,直到右移8次,这样整个8位数据全部进行了处理;
重复步骤2到步骤5,进行下一个8位数据的处理;
最后得到的CRC寄存器即为CRC码。
3.功能码03,读取点和返回值:
  仪表采用Modbus RTU通讯规约,利用通讯命令,可以进行读取点(“保持寄存器) 或返回值(“输入寄存器 )的操作。保持和输入寄存器都是16位(2字节)值,并且高位在前。这样用于仪表的读取点和返回值都是2字节。一次最多可读取寄存器数是60。由于一些可编程控制器不用功能码03,所以功能码03被用作读取点和返回值。从机响应的命令格式是从机地址、功能码、数据区及CRC码。数据区中的寄存器数据都是每两个字节高字节在前。
4.功能码06,单点保存
  主机利用这条命令把单点数据保存到仪表的存储器。从机也用这个功能码向主机返送信息。
二、编程举例
  下面是一个用VC编写的ModBus RTU通讯的例子
(一)、通讯口设置
DCB dcb;
hCom=CreateFile("COM1",
    GENERIC_READ|GENERIC_WRITE,
     0,
     NULL,
     OPEN_EXISTING,
     0,
     NULL);
if(hCom==INVALID_HANDLE_VALUE)
{
  MessageBox("createfile error,error");
}
-crc=crc ^ crcbuf;
for(i=0;i<8;i++)
{
BYTE TT;
TT=crc&1;
crc=crc>>1;
crc=crc&0x7fff;
if (TT==1)
crc=crc^0xa001;
crc=crc&0xffff;
}
}
(三)、数据发送
zxaddr=11;//读取地址为11的巡检表数据
zxnum=10;//读取十个通道的数据
writebuf2[0]=zxaddr;
writebuf2[1]=3;
writebuf2[2]=0;
writebuf2[3]=0;
writebuf2[4]=0;
writebuf2[5]=zxnum;
crc=0xffff;
calccrc(writebuf2[0]);
calccrc(writebuf2[1]);
calccrc(writebuf2[2]);
calccrc(writebuf2[3]);
calccrc(writebuf2[4]);
calccrc(writebuf2[5]);
writebuf2[6]=crc & 0xff;
writebuf2[7]=crc/0x100;
WriteFile(hCom,writebuf2,8,&comnum,NULL);
(四)、数据读取
ReadFile(hCom,writebuf,5+zxnum*2,&comnum,NULL);//读取zxnum个通道数据
可增加错误处理程序,如地址码错误、CRC码错误判断、通讯故障处理等。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
rs-232 串口知识(图)
2008-07-08 16:38
由于RS-232C并未定义连接器的物理特性,因此,出现了DB-25DB-15DB-9各种类型的连接器,其引脚的定义也各不相同。下面分别介绍两种连接器。
1DB-25 PCXT机采用DB-25型连接器。DB-25连接器定义了25根信号线,分为4组:
异步通信的9个电压信号(含信号地SG23456782022
20mA电流环信号 9个(12131415161719,2324
6个(91011182125
保护地(PE1个,作为设备接地端(1脚)
DB-25型连接器的外形及信号线分配如图3所示。注意,20mA电流环信号仅IBM PCIBM PC/XT机提供,至AT机及以后,已不支持。
2DB-9连接器
AT机及以后,不支持20mA电流环接口,使用DB-9连接器,作为提供多功能I/O卡或主板上COM1COM2两个串行接口的连接器。它只提供异步通信的9个信号。DB-25型连接器的引脚分配与DB-25型引脚信号完全不同。因此,若与配接DB-25型连接器的DCE设备连接,必须使用专门的电缆线。
电缆长度:在通信速率低于20kb/s时,RS-232C所直接连接的最大物理距离为15m50英尺)。
最大直接传输距离说明:RS-232C标准规定,若不使用MODEM,在码元畸变小于4%的情况下,DTEDCE之间最大传输距离为15m50英尺)。可见这个最大的距离是在码元畸变小于4%的前提下给出的。为了保证码元畸变小于4%的要求,接口标准在电气特性中规定,驱动器的负载电容应小于2500pF
3RS-232C的接口信号
RS-232C规标准接口有25条线,4条数据线、11条控制线、3条定时线、7条备用和未定义线,常用的只有9根,它们是:
1)联络控制信号线
数据装置准备好(Data t ready-DSR)——有效时(ON)状态,表明MODEM处于可以使用的状态。
数据终端准备好(Data t ready-DTR)——有效时(ON)状态,表明数据终端可以使用。
这两个信号有时连到电源上,一上电就立即有效。这两个设备状态信号有效,只表示设备本身可用,并不说明通信链路可以开始进行通信了,能否开始进行通信要由下面的控制信号决定。
请求发送(Request to nd-RTS)——用来表示DTE请求DCE发送数据,即当终端要发送数据时,使该信号有效(ON状态),向MODEM请求发送。它用来控制MODEM是否要进入发送状态。
允许发送(Clear to nd-CTS——用来表示DCE准备好接收DTE发来的数据,是对请求发送信号RTS的响应信号。当MODEM已准备好接收终端传来的数据,并向前发送时,使该信号有效,通知终端开始沿发送数据线TxD发送数据。
这对RTS/CTS请求应答联络信号是用于半双工MODEM系统中发送方式和接收方式之间的切换。在全双工系统中作发送方式和接收方式之间的切换。在全双工系统中,因配置双向通道,故不需要RTS/CTS联络信号,使其变高。
接收线信号检出(Received Line detection-RLSD)——用来表示DCE已接通通信链路,告知DTE准备接收数据。当本地的MODEM收到由通信链路另一端(远地)的MODEM送来的载波信号时,使RLSD信号有效,通知终端准备接收,并且由MODEM将接收下来的载波信号解调成数字两数据后,沿接收数据线RxD送到终端。此线也叫做数据载波检出(Data Carrier dectection-DCD)线。
振铃指示(Ringing-RI)——MODEM收到交换台送来的振铃呼叫信号时,使该信号有效(ON状态),通知终端,已被呼叫。
2)数据发送与接收线:
发送数据(Transmitted data-TxD)——通过TxD终端将串行数据发送到MODEM(DTEDCE)
接收数据(Received data-RxD)——通过RxD线终端接收从MODEM发来的串行数据,(DCEDTE)
3)地线
有两根线SGPG——信号地和保护地信号线,无方向。
上述控制信号线何时有效,何时无效的顺序表示了接口信号的传送过程。例如,只有当DSRDTR都处于有效(ON)状态时,才能在DTEDCE之间进行传送操作。若DTE要发送数据,则预先将DTR线置成有效(ON)状态,等CTS线上收到有效(ON)状态的回答后,才能在TxD线上发送串行数据。这种顺序的规定对半双工的通信线路特别有用,因为半双工的通信才能确定DCE已由接收方向改为发送方向,这时线路才能开始发送。
2个数据信号:发送TXD;接收RXD
1个信号地线:SG
6个控制信号:
DSR��数传机(即modem)准备好,Data Set Ready.
DTR��数据终端(DTE,即微机接口电路,如Intel8250/8251,16550)准备好,Data Terminal Ready
RTS��DTE请求DCE发送(Request To Send)
CTS��DCE允许DTE发送(Cle ,该信号是对RTS信号的回答。
ar To Send
DCD��数据载波检出,Data Carrier Detection当本地DCE设备(Modem)收到对方的DCE设备送来的载波信号时,使DCD有效,通知DTE准备接收, 并且由DCE将接收到的载波信号解调为数字信号,经RXD线送给DTE
RI��振铃信号 RingingDCE收到交换机送来的振铃呼叫信号时,使该信号有效,通知DTE已被呼叫。
针脚
功能
针脚
功能
1
选通端,低电平有效
10
确认,低电平有效
2
数据通道0
11
3
数据通道1
12
缺纸
4
数据通道2
13
选择
5
数据通道3
14
自动拘行,低电平有效
6
数据通道4
15
错误,低电平有效
7
数据通道5
16
初始化,低电平有效
8
数据通道6
17
选择输入,低电平有效
9
数据通道7
1825
地线
25针串口功能一览表
针脚
功能
针脚
功能
1
11
2
发送数据
1217
3
接收数据
18
4
发送请求
自驾游网站
19
5
发送清除
20
数据终端准备完成
6
数据准备完成
21
7
信号地线
22
振铃指示
简笔画草8
载波检测
2324
9
25
10
9针串口功能一览表
针脚
功能
针脚
功能
1
载波检测
6
数据准备完成
2
发送数据
7
发送请求
3
接收数据
8
发送清除
4
数据终端准备完成
9
振铃指示
5
信号地线

本文发布于:2023-07-19 23:56:57,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1105952.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   发送   接收   信号   功能
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图