Modbus

 

工业现场的总线协议。

1.MODBUS简介:

 Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

485线

-----------------------------------------------------

 

-------------------------------------------------------

在总线上有且只有一个主机

 

 

地址位   功能码    数据码     CRC(校验)   从头到尾的异或运算  8位 16位 32

 

 

06  02  数据倒序

主机校验   从机校验

从机不会主动给主机发信息

主要作用一对多

 

 

2.CRC

2.1CRC简介:

什么是CRC校验?

CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

 

目前在磁表面存储器中应用最广泛的一种校验方法,也是多机网络通信中常用的通信方法。约定规则:让校验能为某一约定所除尽。如果除得尽,校验正确。若除不尽,校验错误。余数将指明错误所在的位置。

 

模2运算:

        通过模2减实现模2除,以模2加将所得余数拼接在被除数后面,形成一个能除尽的校验码。(对除数的选择是有条件的)

        是一种以按位加减为基础的四则运算,不考虑进位和错位。模2加减即按位加减,也就是异域,可用异或门实现。

 

 

.2.2查表法  (快,效率高,占存储大)

unsigned char cal_crc_table(unsigned char *ptr, unsigned char len);//crc查表

 

static const unsigned char crc_table[] =

{

    0X0, 0X5E, 0XBC, 0XE2, 0X61, 0X3F, 0XDD, 0X83, 0XC2, 0X9C, 0X7E, 0X20, 0XA3, 0XFD, 0X1F, 0X41,

    0X9D, 0XC3, 0X21, 0X7F, 0XFC, 0XA2, 0X40, 0X1E, 0X5F, 0X1, 0XE3, 0XBD, 0X3E, 0X60, 0X82, 0XDC,

    0X23, 0X7D, 0X9F, 0XC1, 0X42, 0X1C, 0XFE, 0XA0, 0XE1, 0XBF, 0X5D, 0X3, 0X80, 0XDE, 0X3C, 0X62,

    0XBE, 0XE0, 0X2, 0X5C, 0XDF, 0X81, 0X63, 0X3D, 0X7C, 0X22, 0XC0, 0X9E, 0X1D, 0X43, 0XA1, 0XFF,

    0X46, 0X18, 0XFA, 0XA4, 0X27, 0X79, 0X9B, 0XC5, 0X84, 0XDA, 0X38, 0X66, 0XE5, 0XBB, 0X59, 0X7,

    0XDB, 0X85, 0X67, 0X39, 0XBA, 0XE4, 0X6, 0X58, 0X19, 0X47, 0XA5, 0XFB, 0X78, 0X26, 0XC4, 0X9A,

    0X65, 0X3B, 0XD9, 0X87, 0X4, 0X5A, 0XB8, 0XE6, 0XA7, 0XF9, 0X1B, 0X45, 0XC6, 0X98, 0X7A, 0X24,

    0XF8, 0XA6, 0X44, 0X1A, 0X99, 0XC7, 0X25, 0X7B, 0X3A, 0X64, 0X86, 0XD8, 0X5B, 0X5, 0XE7, 0XB9,

    0X8C, 0XD2, 0X30, 0X6E, 0XED, 0XB3, 0X51, 0XF, 0X4E, 0X10, 0XF2, 0XAC, 0X2F, 0X71, 0X93, 0XCD,

    0X11, 0X4F, 0XAD, 0XF3, 0X70, 0X2E, 0XCC, 0X92, 0XD3, 0X8D, 0X6F, 0X31, 0XB2, 0XEC, 0XE, 0X50,

    0XAF, 0XF1, 0X13, 0X4D, 0XCE, 0X90, 0X72, 0X2C, 0X6D, 0X33, 0XD1, 0X8F, 0XC, 0X52, 0XB0, 0XEE,

    0X32, 0X6C, 0X8E, 0XD0, 0X53, 0XD, 0XEF, 0XB1, 0XF0, 0XAE, 0X4C, 0X12, 0X91, 0XCF, 0X2D, 0X73,

    0XCA, 0X94, 0X76, 0X28, 0XAB, 0XF5, 0X17, 0X49, 0X8, 0X56, 0XB4, 0XEA, 0X69, 0X37, 0XD5, 0X8B,

    0X57, 0X9, 0XEB, 0XB5, 0X36, 0X68, 0X8A, 0XD4, 0X95, 0XCB, 0X29, 0X77, 0XF4, 0XAA, 0X48, 0X16,

    0XE9, 0XB7, 0X55, 0XB, 0X88, 0XD6, 0X34, 0X6A, 0X2B, 0X75, 0X97, 0XC9, 0X4A, 0X14, 0XF6, 0XA8,

    0X74, 0X2A, 0XC8, 0X96, 0X15, 0X4B, 0XA9, 0XF7, 0XB6, 0XE8, 0XA, 0X54, 0XD7, 0X89, 0X6B, 0X35

};

 

 

unsigned char cal_crc_table(unsigned char *ptr, unsigned char len)//crc查表

{

    unsigned char  crc = 0x00;

    while (len--)

    {

        crc = crc_table[crc ^ *ptr++];

    }

    return (crc);

}

2.3.计算法

1)先给CRC0 然后^第一个数又赋值给CRC;

2)如果CRC&0x01!=0 ,就让CRC左移一位然后^0x8C;

3) 返回CRC^下一位数据;

4)检验到最后第二位返回CRC  和最后一位作比较   相等则正确

Example:(计算方式)

CRC取浮点数指针算法

#include <stdio.h>

float H=0,T=0;

unsigned char *ph=(unsigned char*)&H;     //float强制转化成一个char型指针给*ph

unsigned char *pt=(unsigned char*)&T;    

 

unsigned char CRC8(unsigned char crc, unsigned char data)//crc沉余校验算法

 

{

    int j;

    crc = crc ^data;

    for (j = 0; j < 8; j++)

    {

        if ((crc & 0x01) != 0)

        crc = (crc >> 1) ^ 0x8c;

        else crc = crc >> 1;

    }

    return crc;

}

 

int main(void)

{

 

    unsigned char data[16] = {216,7,128,3,0,0,8,72,225,234,64,154,153,181,65,243};

    unsigned char crc=0;

    int i=0;

 

    //date[6]后面的数据位数   加上前面的七位包括  地址位(2位) 功能位(4位)

    for(i=0;i<data[6]+7;i++)//对接收的数据计算校验值

    {

     crc=CRC8(crc,data[i]);

    }

    if(data[i]==crc)//如果校验正确

    {

 

     printf("校验正确 CRC = %#x\n",crc);

 

      for(i=7;i<11;i++)//移动指针存数据

        {

        *ph=data[i];

         ph++;

        }

         for(i=11;i<15;i++)移动指针存数据

        {

        *pt=data[i];

         pt++;

        }

        printf("湿度= %.1f   温度= %.1f\n",H,T);

    }

   else

   printf("校验错误\n");

   return 0;

}

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值