CANOPEN从站协议在stm32f103zet6单片机上的实现-给人

CANopen从站协议在stm32f103zet6单片机上的实现

摘要:本文对CANopen从站协议在stm32f103zet6单片机上的实现做了分析和说明。介绍了CANopen协议的SDO(服务数据对象),PDO(过程数据对象)等报文处理的工作和实现原理,实现了向主站发送数据及处理主站报文等功能。本文中,做了一个从站与一个主站进行数据交互的实现,实验表明CANopen从站协议可以正常使用在stm32f103zet6单片机上,并且可以与CANopen主站进行数据传输等交互操作。

关键词:CANopen;从站协议;服务数据对象;过程数据对象;单片机

1引言

(STM32F103ZET6)(STM32F103ZET6)(STM32F103ZET6)从站设备

(STM32F103ZET6)

图1 CANOPEN连接示意图

CANopen是一种架构在控制局域网路(Control Area Network, CAN)上的高层通讯协定,其协议在嵌入式系统及单片机上广泛使用,是工业控制常用到的一种现场总线。依靠CANopen协议集的支持,可以对不同的从站设备通过总线进行配置和系统

重构。相信在不久的将来随着国内对CANo pen协议的研究深入,CANopen协议会在各个领域有广泛的应用。

CANopen 是OSI模型中的网络层以上(包括网络层)的协定。CANopen 支持网络管理、设备监控及节点间的通讯,其中包括一个简易的传输层,可处理资料的传送。数据的传输和接收都基于CAN总线。如图1,通常多个从站设备靠CANopen网络传输数据给一个CANopen主站设备。

CANopen需要有对象字典,SDO(服务数据对象)处理功能,PDO(过程数据对象)处理功能,定时器,NMT(网络管理)处理功能等。本文着重介绍了CANopen协议的各个功能以及CANopen协议在单片机上stm32f103zet6的设计与实现。

2 CANopen对象字典介绍及设计

对象字典(od:object dictionary)是CAN open协议的核心。对象字典(od:object dict ionary)是一个有序的对象组;每个对象采用一个16位的索引值来寻址,为了允许访问数据结构中的单个元素,同时定义了一个8位的子索引。通过接收主站发送的SDO(服务数据对象)报文,可以设置从站的对象字典,主要对象字典请参见表1。从站在做事件处理时通常会读取对象字典,根据对象字典里的数据进行事件处理。

譬如从站的1017索引是记录从站发送心跳包的时间间隔。当从站程序运行时并且从站是准备、停止、运行状态时,程序会查找1017索引的0号子索引里的数据进行处理。如果里面有数据的话(假设数据为2000),程序则会根据数据所设置的时间通过定时器判断来每2000毫秒发送心跳包。

表1 从站主要对象字典介绍

索引:对象16 位元的位址。数据的类型:一个代表对象的类型,可以是阵列、纪录或只是一个变量。类型:变量的类型。属性:提供此是否可读/可写的资料,有下列四种:可读/写、只读、唯写、只读常数。

以下是建立6003索引的代码案例,并且里面的数据是(2.78593)*100000的代码片

段:

UNS32 AIdata=(2.78593)*100000;//要写入索引数据

static UNS8 highestSubIndex_6003 = 0; // 子索引为:1个(从0开始计数)

subindex Index6003[] =

{

{RW,uint32,sizeof(UNS32),(void*)&AIdata} };//建立索引的读写属性,数据类型,数据大小,索引数据

3 NMT节点管理介绍及设计

NMT(网络管理, Network management)会定义(设备内部)从站的状态变更命令(如启动设备或停止设备)、侦测远端设备故障情形等。通常从站都由主机通过NMT报文来启动、停止和重启。每一个从站还必须配有一个单独的设备标识符,即从站节点ID。(从站节点ID一般在程序启动后,节点初始化状态时设置。)

节点可分为4种状态,初始化状态(Init ialisatio),预操作状态(Pre_operational),操作状态(Operational)和停止状态(Stoppe d)。主站发送来的NMT格式一般为00 00 01 05,其中00 00是NMT功能码,代表主站发来的是NMT报文,01是要将从站节点设定为操作状态(参考表2),05是从站节点的ID。

表2 状态码表

当程序启动或者复位,一开始都是初始化状态,此状态会进行节点内部设置,如设置从站节点ID及一些索引数据的初始化,完成这些操作后,程序进入预操作状态,在预操作状态下,主站通常会通过SDO报文设置从站对象字典,包括心跳时间的设定,同步功能设置,数据存储映射设置等,当设置完毕后,会发送NMT节点管理报文将从站设为操作状态,此时从站节点如果已经设置了同步功能,当从站节点收到主站发送过来的同步报文后(通常是收到的报文是00 80 ,需要从站根据1005对象字典内的数据来确定可识别的同步报文ID,若数据为00 80,那么收到00 80的报文后发送从站状态数据)会返回目前从站的状态数据。

NMT主要涉及的代码为:

proceedNMTstateChange(Message *m)函数:

此函数主要功能是根据主站发送的设定状态码来设置从站节点的状态,代码片段如下:

if( ( (*m).data[1] == 0 ) || ( (*m).dat a[1] == bDeviceNodeId ) ){//判断报文是否是发给本从站

switch( (*m).data[0]){ //解析报文case NMT_Start_Node:

if ( (nodeState == Pre_operat ional) || (nodeState == Stopped) )

nodeState = Operational;

break;

case NMT_Stop_Node:

if ( nodeState == Pre_operati onal ||nodeState == Operational )

nodeState = Stopped;

break;

case NMT_Enter_PreOperationa l:

if ( nodeState == Operational || nodeState == Stopped )

nodeState= Pre_operational;

break;

case NMT_Reset_Node:

nodeState = Initialisation;

break;

4 心跳功能介绍及设计

所谓“心跳”,指的是主站/从站之间的一种通信。采用心跳机制的好处在于,如果从站设备发生故障(如断电,重启等),会停止发送心跳报文,若主站一段时间内没有收

到心跳报文,主站设备就会检测到从站发生了故障。(心跳报文:CANopen设备将根据主站给从站设置心跳时间间隔参数(索引1 017h)的周期发送心跳报文。)

Stm32f103zet6单片机内置定时器用于计算心跳报文发送间隔,假设对象字典设置的数据报文发送间隔为2000毫秒,就可以将定时器设定为每500毫秒累计一次数值5 01,当累加数值大于2000时则发送心跳报文。心跳报文数据格式为07 05 7F。07 05根据协议计算可以知道是从站节点ID为5。(根据CANopen协议设定,心跳报文格式为”Communication Object Identifier”COB-I D+NODE-ID+1位状态码,心跳报文的COB -ID为0x700,0705等于0x700+0x05,则N ODE-ID等于0x05),7F代表从站状态为预操作状态(详见表3)。当发送心跳报文后,数值清0,数值再次每500毫秒累加一次数值501,当累加到大于2000数值时则发送心跳报文,以此无限循环。

图2 心跳报文及定时器工作流程图

表3 心跳报文状态码对照表

心跳功能主要涉及的函数代码为:

定时器设置函数TIM3_Configuration:

此函数主要功能为每500毫秒触发一次定时器函数,代码片段:

void TIM3_Configuration(void)

{

TIM_TimeBaseInitTypeDef TIM_Time BaseStructure;

TIM_TimeBaseStructure.TIM_Period = 9999;

TIM_TimeBaseStructure.TIM_Prescaler = 3599;//公式(1+3599)/72M*(1+9999)=0.5 TIM_TimeBaseStructure.TIM_ClockDivi sion = 0;

TIM_TimeBaseStructure.TIM_CounterM ode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3, &TIM_Time BaseStructure);

触发的定时器函数则进行数值累加,代码片段:

void TIM3_IRQHandler(void)

{

if (TIM_GetITStatus(TIM3, TIM_IT_U pdate) != RESET) {

/* Clear TIM3 update interrupt */

TIM_ClearITPendingBit(TIM3, TIM _IT_Update);

GPIOF->ODR ^= GPIO_Pin_7;//每次让连接PF7管脚的LED灯亮进行状态切换

a=a+501;//每次累加数值501

}

}

另外涉及的heartbeatMGR心跳函数:

此函数功能是对定时器累加的数值做判断,当累加的数值达到对象字典内的数值时则发送心跳报文,代码片段:

if ( should_time )//这个变量为1017索引内的值,通过读取对象字典函数getODen try()获取

{

if( ( a >= should_time ) )

{

msg.cob_id.w= bDeviceNod eId+ 0x700;

msg.len = (UNS8)0x01;

msg.rtr = 0;

msg.data[0] = nodeState;

can_send(&msg);//发送心跳报文

a=0;//发送完毕后将定时器累加的数值清0

}

}

5 SDO服务数据对象介绍及设计

SDO服务数据对象可用来设置及读取远端节点的对象字典其中的资料。当主站要设置从站的对象字典的数据时,需要先发送一个SDO报文,当从站(stm32f103zet6)接收到报文后,会进行报文解析进而形成一个响应报文反馈给主站。参考以下流程图:

图3 从站处理主站SDO流程图

CANopen发送的SDO报文包括11 位元的ID、远端传输请求(RTR)位元及大小不超过8位元的资料。

表4报文介绍

图3 处理写入报文示例

图4处理读取报文示例

从图3看出,从站先接收到主站发送过来的报文06 05 2B 17 00 D0 07 00 00;其中06 05是主站的设置05从站节点的ID (根据CANopen协议设定,主站发送的SD O报文格式为,COB-ID+NODE-ID+8位DATA,主站SDO报文的COB-ID为0x600,0605等于0x600+0x05,则NODE-ID等于0x05,即设定要设置的从站节点为5号节点),2B是代表设置的数据长度为2个字节(2F代表设置的数据长度为1个字节,27代表设置的数据长度为2个字节,23代表设置的数据长度为4个字节),17 10则代表要设置10 1 7索引,后面的00代表设置0号索引,D0 07 00 00代表设置的2个数据为D0 07。(因为只设置2个字节数据长度,所以后面的0 0 00 可以忽略。)如图3所示,当经过SDO 报文处理后,程序会反馈一个SDO响应报文05 85 60 17 00 00 00 00 00 00;其中0 5 85是代表此数据为5号从站返回的数据(从站发送SDO响应报文格式为COB-ID+NO DE-ID+8位数据,从站SDO响应报文的COB -ID为0x580,0585等于0x580+0x05,则N ODE-ID等于0x05,即此数据为5号从站返回的数据),60 代表响应写入成功命令字(若是80的话则是写入错误),17 10代表是对10 17索引的反馈,00 00 00 00代表反馈响应数据成功(若返回失败则返回错误码如:00 00 02 06,则代表是对象字典不存在,此错误代码可以通过代码去设置)。图3是处理设置报文(download)示例。图4是处理读取报文(upload)示例,如图主站发送的报文的第三个字节是40,代表请求读取数据命令字。17 10代表是读取1017索引的数据,从站的响应报文4B代表索引内的数据为2个字节(4F代表索引内的数据为1个字节,47代表索引内的数据为3个字节,43代表索引内的数据为4个字节),数据为D0 07。

SDO功能主要涉及的函数代码为:

proceedSDO(message *m)函数:

此函数主要功能是处理SDO报文并将其封装成响应SDO报文,代码片段:

if((nodeState == Operational) || (node State == Pre_operational))

{

sdo.nodeId = (UNS8) (GET_NOD E_ID((*m)));

MSG_WAR1(0x3A19, "Received SDO for nodeId : ", sdo.nodeId);

sdo.len = (*m).len;

if (sdo.len > 0)

sdo.body.SCS = m->data[0]; //封装SDO报文

for (i = 1 ; i < sdo.len ; i++)

sdo.body.data[i - 1] = m->data [i];

报文通过sendSDO(s_SDO sdo)函数发送:

此函数主要功能是将封装后的SDO报文发送,代码片段:

m.cob_id.w = *pwCobId;

m.rtr = DONNEES;

m.len = 8;

if (sdo.len > 0)

m.data[0] = sdo.body.SCS;

for (i = 1 ; i < sdo.len ; i++) {

m.data[i] = sdo.body.data[i - 1];

}

for (i = sdo.len ; i < 8; i++)m.data[i] =0;//将封装的报文转换成CAN协议帧发送return can_send(&m);

6 PDO过程数据对象及设计

过程数据对象(PDO) 协定可用来在节点之间交换即时的资料。PDO分为两种:传送用的TPDO及接收用的RPDO。一个节点的TPDO是将资料由此节点传输到其他节点,而RPDO则是接收由其他节点传输的资料。从站(stm32f103zet6)目前只设置了TPDO 用于传输从站的数据及传输错误信息,TPD O和RPDO都可以通过代码实现添加和配置。

从站可通过一个TPDO传送最多8 字节资料给一设备。一个PDO可以由对象字典中几个不同索引的资料组成,规划方式则是透过对象字典中对应PDO映射及PDO参数的索引。

PDO可以用同步或异步的方式传送:同步的PDO是从站接收到主站发送的SYNC讯息后触发,而异步的PDO是由从站内部达到一定条件或其他外部条件触发。同时从站报错事件也是由PDO发送。

图5 从站同步传输数据

图5是从站同步传输数据的报文,当从站收到主站发送的00 80报文时,则进入同步传输数据函数,从站会将之前主站设置好的索引内的数据发送给主站,01 81是由主站设置的同步传输标识ID,02 67 6F则是3个索引里的数值,传换成十进制数为15755 1。

同步传输涉及的函数代码为:

Proceedsync(Message *m),此函数功能是封装同步传输PDO报文,代码片段为:if(index==0x2000&&subIndex==1)//将2000索引的1号子索引的数值赋给pdo 的报文

{

*p=x;

}

if(index==0x2000&&subIndex==3)// //将2000索引的3号子索引的数值赋给pdo 的报文{

*p=y;

}

if(index==0x2000&&subIndex==4)// //将2000索引的4号子索引的数值赋给pdo 的报文{

*p=z;

}

if( objDict == OD_SUCCESSF UL ){

MSG_WAR1(0x3011, "Mapped da ta found size bytes : ", *pSize);

if (sizeData != *pSize) {

MSG_WAR1(0x2052, "Size of data different than (size in mapping / 8) : ", sizeData);

}

memcpy(&process_var.data[offset], pMappedAppObject, sizeData);//封装pdo

报文

图6 从站发送错误事件

图6是一个从站发送错误事件的报文,当从站内部程序出现异常时(譬如取不到索引数据等),从站会进行报错,这里错误码和内容可以自己配置。01 83是由主站设置的发送错误事件标识ID,55 1F 00 00代表错误码,CD AB 00 00代表错误的数据。

发送错误事件涉及的函数代码为:

MSG_ERR(num, str, val) ,此函数功能是将错误码和错误数值存入由主站设置的特定索引并封装成PDO报文发送(封装由s endPDOevent函数完成),代码片段为: MSG_ERR(0x1F55, "Error For Test", 0x ABCD);//可发送图6的错误报文

MSG_ERR(num, str, val)//函数原型

{

if(nodeState == Operational ){

canopenErrNB=num;

canopenErrVAL=val;

sendPDOevent(0,&canopenEr

rNB); //发送pdo报文

}

}

图7 从站异步传输数据

图7是一个异步传输数据报文,当内部达到一定条件是,会自动发送PDO报文,笔者将条件设定为如果时间在每小时56分时则发送PDO报文,01 82是主站设置给从站发送异步数据的标识ID,数据为当前时间戳,(0x86转换成十进制是56。)

异步传输数据所涉及函数也是sendPD Oevent函数,此函数功能是将数据封装成P DO报文进行发送,代码片段:

if(minutes==56)

{

sendPDOevent( 0, &minutes );

}

7 CANOPEN从站协议在STM32 F103ZET6单片机上的实现7.1 硬件设置

首先需要对管脚进行设置,由原理图(见图8)可以看出CAN数据传输端CANT X接PB9管脚,CAN数据接收端CANRX接P B8管脚。需要编写gpio_config()函数进行配置,代码片段:

/* Configure CAN pin: RX */

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_ 8;

GPIO_InitStructure.GPIO_Speed=GPIO_S peed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_M ode_IPU;//输入模式

GPIO_Init(GPIOB, &GPIO_InitStructure);

/* Configure CAN pin: TX */

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_ 9;

GPIO_InitStructure.GPIO_Speed=GPIO_S peed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_M ode_AF_PP;//输出模式

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_PinRemapConfig(GPIO_Remap1_C AN1 , ENABLE);//重映射

图8 STM32F103ZET6 CAN原理图

硬件方面设置完毕后,对程序进行设计,程序主要分为两大部分。

7.2主程序介绍及设计

第一部分为main函数部分:程序运行时,进行初始化操作(设置节点ID、中断服务、管脚、发送邮箱、接收邮箱和波特率等),完成后进入对节点对状态进行检测和处理的无限循环程序:从站启动运行后会有四个状态,分别是初始化、预运行、运行、停

止。代码中分别用initialization、pre_operat ional、operational、stopped四种状态来表示,四个状态功能函数分别是initialization(),pre operational(),operational(),stopped(),这些功能函数的主要作用是发送当前状态的心跳报文。用switch语句实现不同状态之间的切换及函数处理。

以下是主程序流程图:

图9 主程序流程图

代码框架大致为:

While(1)

{

switch(nodestatus){

case initialization:

initialization();

break;

case pre_operational:

pre_operational();

break;

case operational:

operational();

break;

case stopped:

stopped();

break; }

}

7.3 中断服务程序介绍及设计

第二部分为中断服务程序:从节点上电启动后,中断等待来自主节点的管理报文,当报文到来的时候,基于中断的接收报文机制产生中断,中断由stm32的硬件进入voi d usb_lp_can_rx0_irqhandler(void)处理接收报文。can接收中断触发了CAN报文接收函数canreceive(&m)。然后通过不同功能码来实现报文的解析和处理。功能函数包括:pr oceednmtstatechange()函数,处理主站NMT 报文,改变从节点状态;proceedsync()函数,用于接收同步报文;proceedpdo()函数,处理pdo报文;proceedsdo()函数,处理sdo 报文。通过功能函数的解析后来执行相应的处理。从而来实现对节点的控制。

以下是中断服务程序流程图:

图10 中断服务程序流程图

代码框架大致为:

CAN_Receive(CAN1,CAN_FIFO0,&RxMe ssage);

if(RxMessage.StdId==0x600+bDeviceNo deId)//检查是否是发给本站的报文

{

工程学院机械设计及理论研究所.V1.0 if((RxMessage.Data[0]==0x2F)||

(RxMessage.Data[0]==0x2B)||(RxMessage.Da

ta[0]==0x27)||(RxMessage.Data[0]==0x23)||

(RxMessage.Data[0]==0x40)|| (RxMessage.D

ata[0]==0x60))//检查功能码

{

proceedSDO(0,&m);//处理SD

O报文

}

if (RxMessage.StdId==0x0000)

//检查功能码

{

proceedNMTstateChange

(&m);//处理NMT报文

}

if (RxMessage.StdId=

=0x0080) 检查功能码

{

proceedSYNC(0,&m);

//处理PDO同步报文

}

7 结束语

CANopen协议作为一种非常有竞争力

标准总线,目前在欧洲已被广泛应用,在中

国,随着工业时代的发展,CANopen协议也

将会被广泛应用。本文介绍了CANopen在s

tm32f103zet6单片机上实现的思路及软件

框架。实现了canopen301协议的所有功能,

经过测试,已经可以成功的将多个单片机上

的数据同时传输到主站设备。为后续国家课

题项目将在现场使用CAN总线采集数据打

下了坚实的技术基础。

参考文献

[1] 叶浩峰. CANopen 总线的原理以及实现

[D]. 2005.

[2] CANopen Application Layer and Commu

nication Profile. CiA Draft Standard 301, Version

4.02,2002[z]

[3] STM32F103ZET6 原理图[z].

[4] 广州周立功单片机发展有限公司.CANope

n 协议介绍[z].

[5]PDO,SDO实例介绍[M].同济大学,机械

多机通信协议规范

通信协议 来自中国工控网 所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送步骤、 检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程,或称传输控制规程,它属于ISO'S OSI七层参考模型中的数据链路层。 目前,采用的通信协议有两类:异步协议和同步协议。同步协议又有面向字符和面向比特以及面向 字节计数三种。其中,面向字节计数的同步协议主要用于DEC公司的网络体系结构中。 串行通讯简单认识 串行通讯的基本概念:与外界的信息交换称为通讯。基本的通讯方式有并行通讯和串行通讯两种。 一条信息的各位数据被同时传送的通讯方式称为并行通讯。并行通讯的特点是:各数据位同时传送,传送速度快、效率高,但有多少数据位就需多少根数据线,因此传送成本高,且只适用于近距离(相距 数米)的通讯。 一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几 千米。 根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。信息只能单向传送为 单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。 串行通讯又分为异步通讯和同步通讯两种方式。在单片机中,主要使用异步通讯方式。 MCS_51单片机有一个全双工串行口。全双工的串行通讯只需要一根输出线和一根输入线。数据的输 出又称发送数据(TXD),数据的输入又称接收数据(RXD)。串行通讯中主要有两个技术问题,一个是数 据传送、另一个是数据转换。数据传送主要解决传送中的标准、格式及工作方式等问题。数据转换是指 数据的串并行转换。具体说,在发送端,要把并行数据转换为串行数据;而在接收端,却要把接收到的 串行数据转换为并行数据。 单工、半双工和全双工的定义 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。 如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。 电话线就是二线全双工信道。由于采用了回波抵消技术,双向的传输信号不致混淆不清。双工信道有时也发信道分开,采用分离的线路或频带传输相反方向的信号,如回线传输。 --------> <--------> --------> A---------B A----------B A---------B <-------- 单工半双工全双工

单片机串口通信协议程序

#include #include #define R55 101 #define RAA 202 #define RLEN 203 #define RDATA 104 #define RCH 105 //#define unsigned char gRecState=R55; unsigned char gRecLen; unsigned char gRecCount; unsigned char RecBuf[30]; unsigned char gValue; void isr_UART(void) interrupt 4 using 1 { unsigned char ch; unsigned char i; unsigned char temp; if (RI==1) { ch=SBUF; switch(gRecState) { case R55: // wait 0x55 if (ch==0x55) gRecState=RAA; break;

case RAA: if (ch==0xaa) gRecState=RLEN; else if (ch==0x55) gRecState=RAA; else gRecState=R55; break; case RLEN: gRecLen=ch; gRecCount=0; gRecState=RDATA; break; case RDATA: RecBuf[gRecCount]=ch; gRecCount++; if (gRecCount>=gRecLen) { gRecState=RCH; } break; case RCH: temp=0; for(i=0;i

设计单片机通讯协议论文(非常经典)

如何设计单片机常用通信 协议论文

目录 1.自定义数据通信协议 (3) 2.上位机和下位机中的数据发送 (3) 3.下位机中的数据接收和协议解析 (4) 4.上位机中的数据接收和命令处理 (8) 5.总结 (9)

单片机通信协议现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。 1.自定义数据通信协议 这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上, 底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。 帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。 地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。 数据类型、数据长度和数据块是主要的数据部分。数据类型可以标识后面紧接着的是命令还是数据。数据长度用于指示有效数据的个数。 校验码则用来检验数据的完整性和正确性。通常对数据类型、数据长度和数据块三个部分进行相关的运算得到。最简单的做法可是对数据段作累加和,复杂的也可以对数据进行CR C运算等等,可以根据运算速度、容错度等要求来选取。 2.上位机和下位机中的数据发送 物理通信层中提供了两个基本的操作函数,发送一个字节数据则为数据发送的基础。数据 包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方

CANopen协议讲解

根据DS301的内容进行介绍 1、CAN总线 CAN标准报文

2、CANopen应用层协议 CANopen 协议不针对某种特别的应用对象,具有较高的配置灵活性,高数据传输能力,较低的实现复杂度。同时,CANopen 完全基于CAN 标准报文格式,而无需扩展报文的支持,最多支持127个节点,并且协议开源。 一个标准的CANopen 节点(下图),在数据链路层之上,添加了应用层。该应用层一般由软件实现,和控制算法共同运行在实时处理单元内。 一个标准的CANopen 节点 CANopen 应用层协议细化了CAN 总线协议中关于标识符的定义。定义标准报文的11 比特标识符中高4 比特为功能码,后7 比特为节点号,重命名为通讯对象标识符(COB-ID)。功能码将所有的报文分为7个优先级,按照优先级从高至低依次为: 网络命令报文(NMT) 同步报文(SYNC) 紧急报文(EMERGENCY) 时间戳(TIME)

过程数据对象(PDO) 服务数据对象(SDO) 节点状态报文(NMT Err Control) 7 位的节点号则表明CANopen 网络最多可支持127个节点共存(0 号节点为主站)。 下表给出了各报文的COB-ID 范围。 NMT 命令为最高优先级报文,由CANopen 主站发出,用以更改从节点的运行状态。 SYNC 报文定期由CANopen 主站发出,所有的同步PDO 根据SYNC报文发送。 EMERGENCY报文由出现紧急状态的从节点发出,任何具备紧急事件监控与

处理能力的节点会接收并处理紧急报文。

TIME 报文由CANopen 主站发出,用于同步所有从站的内部时钟。 PDO 分为4 对发送和接收PDO,每一个节点默认拥有4对发送PDO 和接收PDO,用于过程数据的传递。 SDO 分为发送SDO 和接收SDO,用于读写对象字典。 MT Error Control报文由从节点发出,用以监测从节点的运行状态。 状态机 CANopen 的每一个节点都维护了一个状态机。该状态机的状态决定了该节点当前支持的通讯方式以及节点行为。 初始化时,节点将自动设置自身参数和CANopen 对象字典,发出节点启动报文,并不接收任何网络报文。 初始化完成后,自动进入预运行状态。在该状态,节点等待主站的网络命令,接收主站的配置请求,因此可以接收和发送除了PDO 以外的所有报文。 运行状态为节点的正常工作状态,接收并发送所有通讯报文。 停止状态为一种临时状态,只能接收主站的网络命令,以恢复运行或者重新启动。

51单片机通信协议

单片机通信协议 现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。 1.自定义数据通信协议 这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。 通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。 帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。 地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。 数据类型、数据长度和数据块是主要的数据部分。数据类型可以标识后面紧接着的是命令还是数据。数据长度用于指示有效数据的个数。 校验码则用来检验数据的完整性和正确性。通常对数据类型、数据长度和数据块三个部分进行相关的运算得到。最简单的做法可是对数据段作累加和,复杂的也可以对数据进行CRC运算等等,可以根据运算速度、容错度等要求来选取。 2.上位机和下位机中的数据发送 物理通信层中提供了两个基本的操作函数,发送一个字节数据则为数据发送的基础。数据包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方法也有不同。 在单片机系统中,比较常用的方法是直接调用串口发送单个字节数据的函数。这种方法的缺点是需要处理器在发送过程中全程参与,优点是所要发送的数据能够立即的出现在通信线路上,能够立即被接收端接收到。另外一种方法是采用中断发送的方式,所有需要发送的数据被送入一个缓冲区,利用发送中断将缓冲区中的数据发送出去。这种方法的优点是占用处理器资源小,但是可能出现需要发送的数据不能立即被发送的情况,不过这种时延相当的小。对于51系列单片机,比较倾向于采用直接发送的方式,采用中断发送的方式比较占用RAM资源,而且对比直接发送来说也没有太多的优点。以下是51系列单片机中发送单个字节的函数。 v oid SendBy te(unsigned char ch) { SBUF = ch; while(TI == 0); TI = 0; }

modbus 协议 及 modbus RTU 的 C51 单片机 程序

modbus 协议及modbus RTU 的C51 单片机程序 Modbus通讯协议 Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协议支持传统的RS-232、RS-422、RS-485和以太网设备。许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 当在网络上通信时,Modbus协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成应答并使用Modbus协议发送给询问方。 Modbus 协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。 Modbus 协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave 站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。 下面我来简单的给大家介绍一下,对于Modbus的ASCII、RTU和TCP协议来说,其中TCP 和RTU协议非常类似,我们只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。所以在这里我仅介绍一下Modbus的ASCII和RTU协议。 下表是ASCII协议和RTU协议进行的比较: 协议 开始标记 结束标记

51串口通信协议(新型篇)

51串口通信协议(新型篇) C51编程:这是网友牛毅编的一个C51串口通讯程序! //PC读MCU指令结构:(中断方式,ASCII码表示) //帧:帧头标志|帧类型|器件地址|启始地址|长度n|效验和|帧尾标志 //值: 'n' 'y'| 'r' | 0x01 | x | x | x |0x13 0x10 //字节数: 2 | 1 | 1 | 1 | 1 | 1 | 2 //求和: ///////////////////////////////////////////////////////////////////// //公司名称:*** //模块名:protocol.c //创建者:牛毅 //修改者: //功能描述:中断方式:本程序为mcu的串口通讯提供(贞结构)函数接口,包括具体协议部分 //其他说明:只提供对A T89c51具体硬件的可靠访问接口 //版本:1.0 //信息:QQ 75011221 ///////////////////////////////////////////////////////////////////// #include #include //预定义 //帧 #define F_ST1 0x6e //帧头标志n #define F_ST2 0x79 //帧头标志y #define F_R 0x72 //帧类型读r #define F_W 0x77 //帧类型写w #define F_D 0x64 //帧类型数据帧d #define F_B 0x62 //帧类型写回应帧b #define F_C 0x63 //帧类型重发命令帧c #define F_Q 0x71 //帧类型放弃帧q #define F_ADDR 0x31 //器件地址0-9 #define F_END 0x7a //帧尾标志z #define F_SPACE 0x30 //空标志0 #define F_ERR1 0x31 //错误标志1,flagerr 1 #define F_ERR2 0x32 //错误标志2 2 //常数 #define S_MAXBUF 16 //接收/发送数据的最大缓存量 #define FIELD_MAXBUF 48 //最小场缓存,可以大于48字节,因为协议是以20字节为

CANopen协议介绍

CANopen ?????????CAN-bus????

?? 1??? (1) 2?CAL ?? (2) 3?CANopen (3) 3ˊ1 ????OD (3) 3ˊ2 CANopen?? (4) 3ˊ3 CANopen8?Н??▊ (6) 3ˊ4 CANopen????? (8) 3ˊ5 CANopen boot-up?? (8) 3ˊ6 CANopen?????? (9) 4??? (18) 5??? (19)

1??? ?OSI????????????????????????1???ˊ????2??????????7?????????????????????????????3????????4???????г????5???????6?????????? CAN?Controller Area Network????????Н??1???2???ISO11898?????┉??Ё????????????????????????????Software?????Firmware????????????? ???CAN??Н?ˊ?????????????????????????????????НCAN??Ё?11/29?????8?????????????CAN??????????Ё?????????????????????????????CAN??????????????????CAN ??Ё????????????????????????????????ˊ???z ????Application layer?????Ё??????????????????????? z ?????Communication profile???????????????Н??Н???????z ?????Device proflile?????????????????? ??????????CAN??????CAL?????CAL?????CANopen???CANopen ???CAN-in-Automation(CiA)?Н???П?????????Й?????????????????CANopen?????????CAN?????Ё?:??????????????????????????????????????????????????????????????ā????ā???Ё?????ā????ā?Н????????????????????CANopen????????????????????????? ?OSI??Ё?CAN???CANopen??П?????????? C iA DS P-401C iA DS P-404 CiA DSP-xxx Application C hip Data Link Physical Layer ?1.1 CAN?CANopen???OSI????Ё?????

单片机协议

单片机通信协议 通讯参数数据传输格式数据通讯举例说明协议说明 一、通讯参数 通讯参数包括数据位,停止位,波特率、校验方式。 数据位、停止位、波特率由单片机决定。组态软件中的设定和单片机一致即可。校验方式为和校验。 二、数据传输格式 格式1、组态软件读数据命令格式: 格式2、单片机应答读数据格式(正确): 格式3、组态软件写数据命令格式: 格式4、组态软件位操作写数据命令格式: 格式5、单片机应答读数据格式 三、数据通讯举例说明 1、读数据 组态软件:发送读数据命令(格式1) 单片机:响应读数据命令 正确:返回(格式2) 2、写数据 组态软件:发送写数据命令(格式3)

组态软件:发送开关量写命令(格式4) 单片机:响应写数据命令 正确:返回(格式5) 四、协议说明 数据传输:所有数据均为16进制数 Sta: 设备地址1字节 R:读标志1字节(0x52) W:写标志1字节(0x57) B:位操作写标志1字节(0x42) DataType:需要交换的数据类型,1字节。1,字节;2,字,3,浮点型。 DataNum:要读取的数据的数量,1字节。 DataAddr:为数据偏移地址2字节,低字节在前,高字节在后。数据偏移地址以字节为单位。 Data:实际传输的数据,低字节在前,高字节在后。 DataLong: 单片机返回Data的字节数,2字节,低字节在前,高字节在后。 BitOffset:位操作写命令时,在字节中的位的偏移(0~7)。 LRC:为从第一个字节至LRC前的所有字节的异或值,1字节。 EndCode:

如果结束码EndCode为异常值,则该数据侦的数据无效。

单片机通信协议处理解析

单片机通信协议处理 现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等 1. 自定义数据通信协议 这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的 RS232、 RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。 通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的 TCPIP 协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。 帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。 地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。

十二.PC 机与单片机通信(RS232 协议)

十二.PC 机与单片机通信(RS232 协议) [实验任务] 单片机串口通信的应用,通过串口,我们的个人电脑和单片机系统进行通信。个人电脑作为上位机,向下位机单片机系统发送十六进制或者ASCLL码,单片机 系统接收后,用LED显示接收到的数据和向上位机发回原样数据。 [硬件电路图] [实验原理] RS-232是美国电子工业协会正式公布的串行总线标准,也是目前最常用的串 行接口标准,用来实现计算机与计算机之间、计算机与外设之间的数据通讯。RS-232串行接口总线适用于:设备之间的通讯距离不大于15m,传输速率最大为 20kBps。RS-232协议以-5V-15V表示逻辑1;以+5V-15V 表示逻辑0。我们是 用MAX232芯片将RS232电平转换为TTL电平的。一个完整的RS-232接口有22 根线,采用标准的25芯插头座。我们在这里使用的是简化的9芯插头座。 注意我们在这里使用的晶振是11.0592M的,而不是12M。因为波特率的设置 需要11.0592M的。 “串口调试助手V2.1.exe”软件的使用很简单,只要将串口选择‘CMO1’波特率设置为‘9600’数据位为8 位。打开串口(如果关闭)。然后在发送区里输入要发送的数据,单击手动发送就将数据发送出去了。注意,如果选中‘十六进制发送’那么发送的数据是十六进制的,必须输入两位数据。如果没有选中, 数字二进制Px0~Px7 Abcdefg p 十六进制 0 00111111 00000011 11111100 0xco 1 00000110 10011111 01100000 0xf9

[C语言源程序] #include "reg52.h" //包函8051 内部资源的定义 unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容 sbit gewei=P2^6; //个位选通定义 sbit shiwei=P2^5; //十位选通定义 sbit baiwei=P2^4; unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1, 0x86,0x8e,0x40,}; void Delay(unsigned int tc) //延时程序 { while( tc != 0 ) {unsigned int i; for(i=0; i<100; i++); tc--;} } void LED() //LED显示接收到的数据(十进制) { shiwei=0; P0=table[dat/10]; Delay(10); shiwei=1; gewei=0; P0=table[dat%10]; Delay(10); gewei=1; baiwei=0; P0=table[dat/100]; Delay(10); baiwei=1; } ///////功能:串口初始化,波特率9600,方式1///////// void Init_Com(void) { TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd;

通用单片机通讯协议ascii

组态王与单片机协议 1.通讯口设置: 通讯方式:RS-232,RS-485,RS-422均可。 波特率:由单片机决定(2400,4800,9600and19200bps)。 字节数据格式:由单片机决定。 注意:在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致 2.在组态王中定义设备地址的格式 格式:##.# 前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定; 后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。 3.在组态王中定义的寄存器格式 注意:在组态王中定义变量时,一个X寄存器根据所选数据类型(BYTE,UINT,FLOAT)的不同分别占用一个、两个,四个字节,定义不同的数据类型要注意寄存器后面的地址,同一数据区内不可交叉定义不同数据类型的变量。为提高通讯速度建议用户使用连续的数据区。 例如, 1、在单片机中定义从地址0开始的数据类型为BYTE型的变量: 则在组态王中定义相应的变量的寄存器为X0、X1、X2、X3、X4。。。。。。。。,数据类型为BYTE,每个变量占一个字节 2、在单片机中定义从地址100开始的数据类型为UINT型的变量: 则在组态王中定义相应的变量的寄存器为X100、X102、X104、X106、X108。。。。。。。。,数据类型UINT,每个变量占两个字节

3、在单片机中定义从地址200开始的数据类型为FLOAT 型的变量: 则在组态王中定义相应的变量的寄存器为X200、X20 4、X208、X212。。。。。。。, 数据类型FLOAT ,每个变量占四个字节 3.组态王与单片机通讯的命令格式: 字头:1字节1个ASCII 码,40H 设备地址: 1字节2个ASCII 码,0—255(即0---0x0ffH ) 标志:1字节2个ASCII 码,bit0~bit7, bit0= 0:读,bit0= 1:写。 bit1= 0:不打包。 bit3bit2 = 00,数据类型为字节。 bit3bit2 = 01,数据类型为字。 bit3bit2 = 1x,数据类型为浮点数。 数据地址: 2字节4个ASCII 码,0x0000~0xffff 数据字节数:1字节2个ASCII 码,1—100,实际读写的数据的字节数。 数据…:为实际的数据转换为ASCII 码,个数为字节数乘2。 异或:异或从设备地址到异或字节前,异或值转换成2个ASCII 码 CR :0x0d 。 通讯尝试恢复命令(COMERROR ),请求地址为0的一个BYTE 数据 3.1.上位机发送读命令 下位机应答:若正常: 若不正常: 100,数据类型为字节,不打包。组态王所 若正确:

CAN总线与CANopen协议

CAN总线与CANOpen协议 一CAN总线简介 1.1 引言 在20世纪90年代的汽车研究领域,采用总线分布式控制获得了很大的成功。用户要求汽车的控制系统具有优越的性能以保证汽车的安全性和舒适性,因此越来越多的具有超强计算能力的电子设备加载在汽车上。这就要求不同的电子设备之间能够进行通信和数据交换,以达到信息共享协调工作的目的。德国的博世公司(Bosch)率先将CAN总线(Controller Area Network)应用于汽车电子控制系统,解决了控制系统的部件之间的以及控制系统与测试设备主机的数据交换问题,替代了原有网络(用于车体控制的LIN网络、用于厂内环境控制的MOST 网络及原有车内通信的Flecray网络等)实现的功能。由于其独特的设计思想和高可靠性,在不同总线标准的竞争中获得了广泛的认可,并逐渐成为汽车最基本的控制网络,广泛应用于火车、机器人、楼宇控制、机械制造、数字机床、医疗器械、自动化仪表等领域。 图1.1 早期的ECU(汽车电子控制单元)通信 CAN总线是一种串行通信协议,具有较高的通信速率的和较强的抗干扰能力,可以作为现场总线应用于电磁噪声较大的场合。由于CAN总线本身只定义ISO/OSI模型中的第一层(物理层)和第二层(数据链路层),通常情况下CAN 总线网络都是独立的网络,所以没有网络层。在实际使用中,用户还需要自己定义应用层的协议,因此在CAN总线的发展过程中出现了各种版本的CAN应用

层协议,现阶段最流行的CAN应用层协议主要有CANopen、DeviceNet和J1939等协议。 图1.2 基于总线(CAN)的ECU通信 1.2 CAN总线的特点 CAN总线并不采用物理地址的模式传送数据,而是每个消息有自己的标识符用来识别总线上的节点。标识符主要有2个功能:消息滤波和消息优先级确定。节点利用标识符确定是否接收总线上的传送的消息当有2个或更多节点需要传送数据时,根据标识符确定消息的优先级。总线访问采用多主原则,所有节点都可以作为主节点占用总线。CAN总线相对于Ethernet具有非破坏性避免总线冲突的特点(CSMA/CA协议,与CSMA/CD协议相似),这种方式可以保证在产生总线冲突的情况下,具有更高优先级的信息没有被延时传输。 其物理传输层详细和高效的定义,使得CAN总线具有其它总线无法达到的优势,注定其在工业现场总线中占有不可动摇的地位,CAN总线通信主要具有如下所示的优势和特点: (1)CAN总线上任意节点均可在任意时刻主动的向其它节点发起通信,节点没有主从之分,但在同一时刻优先级高的节点能获得总线的使用权,在高优先级的节点释放总线后,任意节点都可使用总线; (2)CAN总线传输波特率为5Kbps~1Mbps,在5Kbps的通信波特率下最远传输距离可以达到10Km,即使在1Mbps的波特率下也能传输40m的距离。在1Mbps波特率下节点发送一帧数据最多需要134μs; (3)CAN总线采用载波监听多路访问、逐位仲裁的非破坏性总线仲裁技术。在节点需要发送信息时,节点先监听总线是否空闲,只有节点监听到总线空

基于Modbus协议实现单片机与PLC之间的通讯

基于Modbus协议实现单片机与PLC之间的通讯 来源:PLC&FA 作者:蔡晓燕赵兴群万遂人董鹏云 关键词:可编程控制器 Modbus 通讯协议 1 引言 HMI(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备中。它有字母、汉字、图形和图片等不同的显示,界面简单友好。配有长寿命的薄膜按钮键盘,操作简单。它一般采用具有集成度高、速度快、高可靠且价格低等优点的单片机[1]作为其核心控制器,以实现实时快速处理。PLC和单片机结合不仅可以提PLC的数据处理能力,还可以给用户带来友好简洁的界面。本文以Modbus通讯协议为例,详细讨论了一个人机系统中,如何用C51实现单片机和PLC之间通讯的实例。 2 Modbus通讯协议[4] Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信。 Modbus协议提供了主—从原则,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。主设备查询的格式:设备地址(或广播,此时不需要回应)、功能代码、所有要发送的数据、和一错误检测域。从设备回应消息包括确认地址、功能码、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。 控制器能设置为两种传输模式:ASCII和RTU,在同样的波特率下,RTU可比ASCII方式传送更多的数据,所以采用KTU模式。 (1) 典型的RTU消息帧 典型的RTU消息帧如表1所示。

RTU消息帧的地址域包含8bit。可能的从设备地址是0...127(十进制)。其中地址0是用作广播地址,以使所有的从设备都能认识。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。 RTU消息帧中的功能代码域包含了8bits,当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为;当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应,一般是将功能码的最高位由0改为1)。 从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代 码所定义的行为。这包括了像不连续的寄存器地址,要处理项的数目,域中实际数据字节数。如果没有错误发生,从从设备返回的数据域包含请求的数据。如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。 当选用RTU模式作字符帧时,错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测(CRC)方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。 (2) 所有的Modbus功能码 Modbus的功能码定义如表2所示。

手把手教你学51单片机之十八RS485通信与Modbus协议

在工业控制、电力通讯、智能仪表等领域,通常情况下是采用串口通信的方式 进行数据交换。最初采用的方式是 RS232 接口,由于工业现场比较复杂,各 种电气设备会在环境中产生比较多的电磁干扰,会导致信号传输错误。除此之外, RS232 接口只能实现点对点通信,不具备联网功能,最大传输距离也只能达到 几十米,不能满足远距离通信要求。而 RS485 则解决了这些问题,数据信号采用 差分传输方式,可以有效的解决共模干扰问题,最大距离可以到1200 米,并且 允许多个收发设备接到同一条总线上。随着工业应用通信越来越多, 1979 年施耐 德电气制定了一个用于工业现场的总线协议 Modbus 协议,现在工业中使用 RS485 通信场合很多都采用 Modbus 协议,本节课我们要讲解一下 RS485 通信和Modbus 协议。 单单使用一块KST-51 开发板是不能够进行RS485 实验的,应很多同学的要求,把这节课作为扩展课程讲一下,如果要做本课相关实验,需要自行购买USB 转 485 通信模块。 18.1 RS485通信 实际上在 RS485 之前 RS232 就已经诞生,但是RS232 有几处不足的地方: 1、接口的信号电平值较高,达到十几V ,容易损坏接口电路的芯片,而且和TTL 电平不兼容,因此和单片机电路接起来的话必须加转换电路。 2、传输速率有局限,不可以过高,一般到几十Kb/s 就到极限了。 3、接口使用信号线和GND 与其他设备形成共地模式的通信,这种共地模式传输容易产生 干扰,并且抗干扰性能也比较弱。 4、传输距离有限,最多只能通信几十米。 5、通信的时候只能两点之间进行通信,不能够实现多机联网通信。 针对 RS232 接口的不足,就不断出现了一些新的接口标准,RS485 就是其中之一,他具备 以下的特点: 1、我们在讲A/D 的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大 的优势是可以抑制共模干扰。尤其工业现场的环境比较复杂,干扰比较多,所以通信如果采用的是差分方式,就可以有效的抑制共模干扰。而RS485 就是一种差分通信方式,它的通 信线路是两根,通常用 A 和B 或者D+ 和 D- 来表示。逻辑“ 1”以两线之间的电压差为+(0.2~6)V 表示,逻辑“0”以两线间的电压差为-(0.2~6)V来表示,是一种典型的差分通信。 2、 RS485通信速度快,最大传输速度可以达到10Mb/s以上。 3、RS485 内部的物理结构,采用的是平衡驱动器和差分接收器的组合,抗干扰能力也大大 增加。 4、传输距离最远可以达到1200 米左右,但是他的传输速率和传输距离是成反比的,只有 在100Kb/s 以下的传输速度,才能达到最大的通信距离,如果需要传输更远距离可以使用中继。

(合同制定方法)单片机与上位机通信协议的制定

(合同制定方法)单片机与上位机通信协议的制定

单片机和上位机通信协议的制定 单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定!上行协议,即由单片机向上位机发送数据。 下行协议,即由上位机向单片机发送数据。 而通信协议又要分固定长度和不定长度俩种 本文所介绍的协议属于简单的固定字长的通信协议! 下行协议由四个字节构成

上表是简单的上位机对单片机的控制指令 下述函数是C#中封装的串口通信类中的发送函数的封装publicvoidSerSendCommu(byteorderDef,bytedata)//参数1为命令字,参数二为要发送的数 //据,需要时可直接调用 { Byte[]BSendTemp=newByte[SEND_LENTH]; BSendTemp[0]=PRE; BSendTemp[1]=orderDef; BSendTemp[2]=data; BSendTemp[3]=END; this.serialPort1.Write(BSendTemp,0,SEND_LENTH); } 下位机中用中断方式接收字符,本文用的是GCC语言,下面是串口接收数据中断 ISR(USART_RXC_vect)//串口接收中断

{ unsignedcharstatus,data; status=UCSRA;//**首先读取UCSRA的值,再读取UDR值,顺序不能颠倒,否则读取UDR后的UCSRA的 //值即会改变** data=UDR; if(!Uart_RecvFlag)//判断缓存中的数据是否读完,读完则接收指令 { if((status&((1<

can总线与canopen协议

竭诚为您提供优质文档/双击可除can总线与canopen协议 篇一:?canopen协议讲解 根据ds301的内容进行介绍 1、can总线 can标准报文 2、canopen应用层协议 canopen协议不针对某种特别的应用对象,具有较高的配置灵活性,高数据传输能力,较低的实现复杂度。同时,canopen完全基于can标准报文格式,而无需扩展报文的支持,最多支持127个节点,并且协议开源。 一个标准的canopen节点(下图),在数据链路层之上,添加了应用层。该应用层一般由软件实现,和控制算法共同运行在实时处理单元内。 一个标准的canopen节点 canopen应用层协议细化了can总线协议中关于标识符的定义。定义标准报文的11比特标识符中高4比特为功能码,后7比特为节点号,重命名为通讯对象标识符(cob-id)。功能码将所有的报文分为7个优先级,按照优先级从高至低

依次为: 网络命令报文(nmt) 同步报文(sync) 紧急报文(emeRgency) 时间戳(time) 过程数据对象(pdo) 服务数据对象(sdo) 节点状态报文(nmterrcontrol) 7位的节点号则表明canopen网络最多可支持127个节点共存(0号节点为主站)。 下表给出了各报文的cob-id范围。 nmt命令为最高优先级报文,由canopen主站发出,用以更改从节点的运行状态。 sync报文定期由canopen主站发出,所有的同步pdo根据sync报文发送。 emeRgency报文由出现紧急状态的从节点发出,任何具备紧急事件监控与处理能力的节点会接收并处理紧急报文。 time报文由canopen主站发出,用于同步所有从站的内部时钟。 pdo分为4对发送和接收pdo,每一个节点默认拥有4 对发送pdo和接收pdo,用于过程数据的传递。 sdo分为发送sdo和接收sdo,用于读写对象字典。

相关文档
最新文档