tag 标签: modbus

相关帖子
相关博文
  • 热度 1
    2015-8-5 12:59
    257 次阅读|
    0 个评论
      ;modbus CRC16 TEST_CRC16:  ;R0,R3,R4,DPH,DPL,A,PSW.   R0为起始单元   R4为数据长度,结果在DPH,DPL中   ;① 装入一个16位寄存器,所有数位均为1。        MOV DPH,#0FFH              MOV DPL,#0FFH CRCJ1:       MOV R3,#8              MOV A,@R1              XRL A,DPL        ;② 该16位寄存器的低位字节与开始8位字节进行"异或"运算。运算结果放入这个16 位寄存器。        MOV DPL,A  CRCJ2:       MOV A,DPH       CLR C       RRC A       MOV DPH,A       MOV A,DPL       RRC A       MOV DPL,A ;③ 把这个16寄存器向右移一位。        JNC  CRCJ3 ;④ 若向右(标记位)移出的数位是1,则用多项式1010000000000001 和这个寄存器进行"异或"运算;若向右移出的数位是0,则返回③。   ;--------------       MOV A,#01H       XRL A,DPL       MOV DPL,A       MOV A,#0A0H       XRL A,DPH       MOV DPH,A CRCJ3: ;⑤ 重复③和④,直至移出8位。        DJNZ R3,CRCJ2 ;⑥ 另外8位与该十六位寄存器进行"异或"运算。        INC R1 ;⑦ 重复③~⑥,直至该报文所有字节均与16位寄存器进行"异或"运算,并移位8次。        DJNZ R4,CRCJ1 CRC_END: ;⑧ 这个16位寄存器的内容即2字节CRC错误校验,被加到报文的最高有效位。  ;MOV 70H,DPL   ;发送与返回的CRC16代码,低字节在前,高字节在后 ;MOV 71H,DPH RET  
  • 热度 3
    2015-5-19 08:35
    1447 次阅读|
    2 个评论
    我先站个位。 靠,博客编辑器有问题,编辑了一大段,提交时不对,都没有了。   贴个我的软件吧,非常可靠,额米有第三方控件.只是msscom串口控件,结合定时器完成,速率从115200-1200我都测试了.非常可靠.  
  • 热度 6
    2013-4-24 19:42
    5072 次阅读|
    4 个评论
    Modbus_RTU  移植 ?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /                                                                作者: iControl 首先没接触过通信协议的朋友会问 Modbus 是什么,我就简单的说下了。 Modbus 不是硬件,而是基于硬件的总线协议。至于为什么要用 Modbus , Modbus 的优缺点这些官方的资料我就不解释了(请朋友们自己百度)。这里我给大家介绍的是如何移植 Modbus 。 Modbus 的种类很多,像是 Modbus , NModbus , FreeModbus 等等,其实都差不多,只不过有些搭载的平台不一样。 这里给大家介绍的是比较简单的 Freemodbus , 因为我是他们的会员,所以有比较完整的资料。  http://www.freemodbus.org/   FreeModbus  分主站和子站两类,主站和子站的模式又有 RTU , TCP , ASC 模式。 首先介绍下 FreeModbus_RTU 子站的移植方法,目前的最高版本是: mbslave-v2.9.5 我的硬件平台是 STM32 。 移植 Modbus 需要用到单片机的一个串口和一个定时器,这里使用的是 USART1(USART2) 和 TIM3 。 新建文件夹包含文件如图,需要修改的 C 文件是 mbportserial.c 和 mbporttime.c 和 mbportother.c 。 mbportserial.c 是和串口参数配置有关的文件,包含串口初始化,中断向量配置。 Mbporttime.c  是和定时器参数配置有关文件,包含定时器初始化和中断配置。 Mbportother.c 是单片机的中断配置,不同类型的单片机都要在这里更改自己的中断进入和退出函数。 具体的代码录入就不详细说明了,源码中写得很清晰,有不明白的可以交流。其他模式的移植都差不多 主要就是这三种文件的修改。        
  • 热度 1
    2012-11-23 13:23
    1154 次阅读|
    1 个评论
      MODBUS通信协议 应用 /********************************************** 程序:周波控制器MODBUS通信程序3th最终版(成功)带通信故障检测实时监测 描述:默认内部时钟3.5M,关闭看门狗,9位UART,允许中断,波特率9570bps 功能:检测控制信号,使用MODBUS与周波控制块通信; 资源: P0.4TX P0.5RX, ENR485 P0.6 LED1 P0.7, LED2 P1.0; key P1.1, relay P1.5; RB80,TB80,TI0,RI0 SBUF0 编写:    日期:2009,12,03 修改:     日期: 修改内容:开关函数名,发送中断中的一个等号,加上rx_counter=0;接收第一个数据修改,偶校验使用硬件,命令位数修改,加CRC加发送位数     rx_total的判断修改了,添加checkerror标志请缓冲区也清错误;deal_rxdata换位置到接收完成里面,rb80==p修改,     请标志开中断放进中断里面,CRC用别人的,家继电器控制     删除key——check;修改了关断指令的位数,接收地址加了判断,偶校验删除,接收也CRC ,crc高高低位顺序修改 公司:********接口及测试: 经过优化:com_addr 重新初始化为8位模式,CRC还是高先发 ************************************************/ ///////////////////////////////////// // Generated Initialization File // ///////////////////////////////////// #include "C8051F330.h" // Peripheral specific initialization functions, // Called from the Init_Device() function void PCA_Init() {     PCA0MD    = ~0x40;     PCA0MD    = 0x00;     PCA0CPL2 = 0xFF;     PCA0MD    |= 0x40; } void Timer_Init() {     TCON      = 0x40;     TMOD      = 0x20;     CKCON     = 0x08;     TH1       = 0x60; } void UART_Init() {     SCON0     = 0x10; } void Port_IO_Init() {     // P0.0 - Unassigned, Open-Drain, Digital     // P0.1 - Unassigned, Open-Drain, Digital     // P0.2 - Unassigned, Open-Drain, Digital     // P0.3 - Unassigned, Open-Drain, Digital     // P0.4 - TX0 (UART0), Push-Pull, Digital     // P0.5 - RX0 (UART0), Push-Pull, Digital     // P0.6 - Unassigned, Push-Pull, Digital     // P0.7 - Unassigned, Push-Pull, Digital     // P1.0 - Unassigned, Push-Pull, Digital     // P1.1 - Unassigned, Open-Drain, Digital     // P1.2 - Unassigned, Open-Drain, Digital     // P1.3 - Unassigned, Open-Drain, Digital     // P1.4 - Unassigned, Open-Drain, Digital     // P1.5 - Unassigned, Push-Pull, Digital     // P1.6 - Unassigned, Open-Drain, Digital     // P1.7 - Unassigned, Open-Drain, Digital     P0MDOUT   = 0xF0;     P1MDOUT   = 0x21;     XBR0      = 0x01;     XBR1      = 0x40; } void Interrupts_Init() {     IE        = 0x90; } // Initialization function for device, // Call Init_Device() from your main program void Init_Device(void) {     PCA_Init();     Timer_Init();     UART_Init();     Port_IO_Init();     Interrupts_Init(); }   /*************************************************/ /**************************************************/ #define uchar unsigned char #define uint unsigned int /******与移植相关的****I/O定义******/ #define com_addr 0x01      //从站地址 sbit R485 = P0^6;          //485控制端高电平接收 sbit GREEN = P0^7;        //led sbit RED = P1^0;        //led sbit KEY = P1^1;        //开关检测 sbit RELAY = P1^5;        //控制继电器 /*********变量声明***********/ bit crc_ok,send_ok,read_ok;   //全局变量供观察用 bit action,com_ok; uchar crch,crcl,flag; uchar checkerror; uchar rx_counter,tx_counter; uchar rx_total,tx_total; uchar xdata BUFFER = {        com_addr,0x05,0x00,0x00,0xff,0x00,0x00,0x00        }; //启动命令末尾CRC uchar xdata READ = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ; /* CRC低位字节值表*/ uchar code auchCRCLo = SBUF0;     } if(rx_counter==(rx_total-1))   //接收完成    {    addr_ok =0;          deal_rxdata();      }   } else { checkerror = 2;                       //奇偶校验失败 } } /***************************************************************** 函数功能:发送中断服务 应用范围: 调用函数:clear_buffer 入口数据:tx——counter,缓冲区 出口数据:R485 服务函数: ******************************************************************/ void tx_data(void) { TI0   =0; if(tx_counter8)         //未发送完 {     tx_counter++; ACC =BUFFER ; TB80 =1; SBUF0 =BUFFER ; } else         //发送完成 { R485 =1; tx_counter =0; clear_buffer();     //清空缓冲区 } } /************************************************************* 函数功能:CRC校验 应用范围:全局 调用函数:无 入口数据:缓冲区首地址,数据字节数 出口数据:crc3,crc2,crc_Ok 服务函数:被调用 ************************************************ok***********/ void crc16(uchar *puchMsg, uchar usDataLen) { uchar uchCRCHi = 0xFF ; /* 高CRC字节初始化 */ uchar uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */ uchar uIndex ; /* CRC循环中的索引 */ while (usDataLen--) /* 传输消息缓冲区 */ {    uIndex   = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */    uchCRCHi = uchCRCLo ^ auchCRCHi ;    uchCRCLo = auchCRCLo ; } crch = uchCRCHi; crcl = uchCRCLo; } /***************************************************************** 函数功能:开启周波控制器 应用范围: 调用函数:crc16 入口数据: 出口数据: 服务函数:把开启命令送入发送缓冲区并启动发送 ******************************************************************/ void turnon_pwm(void) { uchar x; uchar *on = OPEN; uchar *buf = BUFFER; R485 =0; for(x=0;x6;x++) { *(buf+x) =*(on+x); } crc16(BUFFER,6); *(buf+7) =crcl; *(buf+6) =crch; TI0 = 1; } /***************************************************************** 函数功能:关闭周波控制器 应用范围: 调用函数:crc16 入口数据:被调用 出口数据:R485,TI0 服务函数:把关闭命令送进发送缓冲区并启动发送 ******************************************************************/ void turnoff_pwm(void) { uchar x; uchar *on = OPEN; uchar *buf = BUFFER; R485 =0; for(x=0;x6;x++)          //加载命令 { *(buf+x) =*(on+x); } *(buf+4) = 0x00;      //关闭命令 crc16(BUFFER,6); *(buf+7) =crcl; *(buf+6) =crch; rx_total = 9; TI0 = 1; } /***************************************************************** 函数功能:读周波控制器 应用范围: 调用函数:crc 入口数据:被调用 出口数据:r485,rx_total 服务函数: ******************************************************************/ void read_pwm(void) { uchar x; uchar *on = READ; uchar *buf = BUFFER; R485 =0; for(x=0;x6;x++) { *(buf+x) =*(on+x); } crc16(BUFFER,6); *(buf+7) =crcl; *(buf+6) =crch; rx_total = 7; TI0 = 1; } /***************************************************************** 函数功能:处理从周波控制器返回的数据 应用范围: 调用函数:无 入口数据:缓冲区数据 出口数据:指示灯以及错误类型 服务函数:rx_data **********************************************************要修改灯控********/ void deal_rxdata(void) { uchar temp6,temp7,temp8; bit crc2ok; com_ok =1; flag = 0; crc16(BUFFER,(rx_total-3)); temp6 =crcl; temp7 =crch; if(temp6==BUFFER temp7==BUFFER ) { crc_ok=1; } if(temp6==BUFFER temp7==BUFFER ) { crc2ok=1; } /********************* if(BUFFER == 0x05crc_ok==1) //自动返回的数据 { send_ok     =1; crc_ok =0; if(BUFFER ==0xff) //运行状态绿灯亮    {    RED   =1;      GREEN =0;    } if(BUFFER ==0x00) //关闭状态红灯亮    {    GREEN =1;    RED   =0;    } } ********************************************/ if(BUFFER == 0x01crc2ok==1) //读回的数据 { read_ok     =1; crc2ok =0; if(BUFFER ==0x01)    {    temp8 =BUFFER 0x0f;    if(temp8==0)          //未开启     {     GREEN =1;            RELAY =1;      //输出开关闭合     }    else                  //开启     {     GREEN =0;     RELAY =0;      //输出开关吸合     }       }     } //如果是读回来的数据read_ok=1 R485 =0;               //准备发送 rx_counter=0; clear_buffer(); } /***************************************************************** 函数功能:清空缓冲区 应用范围:全局 调用函数:无 入口数据:缓冲区数据,checkerror 出口数据:无 服务函数: ******************************************************************/ void clear_buffer(void) { uchar *buf =BUFFER; uchar x; for(x=0;x14;x++) { *(buf+x) = 0x00; } checkerror =0; } /***************************************************************** 函数功能:检测按钮命令 应用范围:全局 调用函数:delay10ms 入口数据:无 出口数据:flag 服务函数:无 ******************************************************************/ uchar check_key(void) { uchar flag = 0; if(KEY ==1)   //电平翻转 { delay10ms(); if(KEY ==1) //保持翻转后的状态为接触    {    flag = 1;    //置发信号标志    }     } else { delay10ms(); if(KEY ==0) //保持翻转后的状态为接触      {    flag = 2;    //置关信号标志    } } action =KEY; return flag; } /************************修改******************/ void delay10ms(void) { uint x; for(x=0;x10000;x++) { }; PCA0CPH2 = 0x00; } /*************************/ void check_com(void) { if(com_ok==0)    {    RED =0;    } else    {    RED =1;    } } /****************************************************************/ /*************************主函数*********************************/ /****************************************************************/ main(void) { bit open,close; Init_Device( ); action =KEY; R485 =0;    //处于发送状态 PCA0CPH2 = 0x00; com_ok =1; do{ com_ok =0; flag = check_key(); //检测开关 if(flag ==1open==0)            //要开启PWM    {    turnon_pwm();    com_ok =0;    delay10ms();    open =1;    close =0;    }          if(flag ==2close==0)         //要关闭PWM      {    turnoff_pwm();    //周波控制    com_ok=0;    delay10ms();    open =0;    close =1;    }      read_pwm();    check_com(); }while(1); }
  • 热度 2
    2011-8-8 15:38
    948 次阅读|
    0 个评论
    详细请下载资料:  
相关资源
  • 所需E币: 1
    时间: 2020-5-25 17:42
    大小: 601.13KB
    上传者: Argent
    使用单片机可以开发一些常见的智能设备,无需高昂的价格,低成本高稳定性的产品才是市场竞争的王道,掌握单片机的设计思路,使用人类的编程语言去操控机器设备的运转,单片机改变了这个时代。一个既需要懂单片机的硬件基础知识,又需掌握软件上的编程控制的岗位应运而生,即单片机开发工程师,高级一点的叫嵌入式开发工程师,下载我的这些有关单片机开发的应用知识,助你更深入地了解单片机工作原理,增强你的编程动手能力。
  • 所需E币: 0
    时间: 2020-5-25 14:59
    大小: 236.91KB
    上传者: Argent
    VB是早期比较流程的编程语言,VisualBasic由微软公司开发,是世界上使用人数最多的语言。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。感兴趣的网友们快来下载,练练手吧。
  • 所需E币: 4
    时间: 2019-12-26 01:08
    大小: 9.72KB
    上传者: quw431979_163.com
    电力控制器MODBUS协议表……
  • 所需E币: 5
    时间: 2019-12-26 00:36
    大小: 21.35KB
    上传者: 二不过三
    MODBUS通讯协议在火电厂自动化改造中的应用……
  • 所需E币: 4
    时间: 2019-12-25 17:28
    大小: 963.76KB
    上传者: rdg1993
    CLINK与ModBus 通讯功能的应用……
  • 所需E币: 3
    时间: 2019-12-25 15:46
    大小: 10.88MB
    上传者: wsu_w_hotmail.com
    嵌入式对话地址:广州市天河北路689号光大银行大厦12楼F4电话:(020)38730923387309163873258538730917广州周立功单片机发展有限公司技术支持电话:(020)2264425228267819E-mail:Luminary.support@zlgmcu.comLuminary.design@zlgmcu.com上海周立功:(021)53083451-812南京周立功:(025)83603500-811杭州周立功:(0571)88009201-307重庆周立功:(023)68796438广州专卖店:(020)87569917北京周立功:(010)62536178-126成都周立功:(028)85437446-803深圳周立功:(0755)83795904武汉周立功:(027)87168297西安办事处:(029)87881296地址:广州市天河北路689号光大银行大厦12楼F4电话:(020)38730923387309163873258538730917广州周立功单片机发展有限公司技术支持电话:(020)2264425228267819E-mail:Luminary.support@zlgmcu.comLuminary.design@……
  • 所需E币: 5
    时间: 2020-1-2 01:56
    大小: 307.56KB
    上传者: 二不过三
    通过基于Modbus总线的通讯实验,给出了Modbus网络的特性参数,并通过Matlab仿真工具将其应用于一个典型的二阶闭环控制系统的仿真中;指出了网络时延对控制系统稳定性的影响,并给出了解决方法.边程控制系统巾Modbus网络昀性鹾分析孙强,刘鑫(北京康拓科技开发总公司生化部,北京100080)摘要:通过基于Modbus总线的通讯实验,给出了Modbus网络的特性参数,并通过Matlab仿真工具将其应用于一个典型的二阶闭环控制系统的仿真中;指出了网络时延对控制系统稳定性的影响,并给出了解决方法。关键词:Modbus过程控制系统现场总线根轨迹Modbus作为一种现场总线网络协议,由于其具有时延。结构简单、易于操作和实现,以及协议本身完全公开等参数的定义如下:特点,在我国的工业领域被广泛应用。其中很多应用都吞吐量:每秒传送的最大数据包数,用S表示。是基于传统的RS一485串行网络实现的,通讯速率大多时延:一个数据帧中的有效数据传输实际时间乃数都在38.4kbps以下,如9600bps,因而很多过程控制……
  • 所需E币: 3
    时间: 2020-3-8 08:51
    大小: 4.43MB
    上传者: Whale866
    Modbus高级通讯教程
  • 所需E币: 4
    时间: 2019-12-24 14:50
    大小: 101.66KB
    上传者: 978461154_qq
    CRC16校验码生成软件绿色版,测试环境windows7旗舰版未经过杀毒软件测试……
  • 所需E币: 5
    时间: 2019-12-24 00:46
    大小: 94.94KB
    上传者: wsu_w_hotmail.com
    modbus协议……
  • 所需E币: 4
    时间: 2019-6-23 13:39
    大小: 5.84MB
    上传者: royalark_912907664
    基于RT-Thread的MODBUS从协议栈的设计与实现
  • 所需E币: 3
    时间: 2019-6-12 20:06
    大小: 828.38KB
    上传者: royalark_912907664
    随着动力环境监控系统的不断发展,远程终端设备数据的采集变得格外重要,而ARM嵌入式产品在性能、成本和功耗上更具优势。利用ARM11和Linux嵌入式平台采集智能化终端设备数据,通过搭建嵌入式WEB服务器将数据以因特网形式进行远距离传输。针对智能化RS485型温湿度传感器,对其进行Modbus协议解析并提取数据,利用循环冗余校验方法提高了数据接收的可靠性,并采用AJAX实时刷新技术实现数据在网页上局部动态的更新。局域网内,客户端通过页面中按钮实现数据以1秒更新显示,通过设定相应门限来触动报警以期达到远程实时监控效果。
  • 所需E币: 3
    时间: 2019-6-11 22:40
    大小: 1.23MB
    上传者: royalark_912907664
    为满足工业控制中不同功能模块的信息交换、无法联网和远程控制不方便等问题,设计了一种基于STM32微控制器的串口数据采集、处理和传输的串口服务器系统。系统以STM32F103RBT6为核心处理芯片,通过USR-WIFI232-D2双网模组进行WIFI无线传输,并使用RS232和RS485芯片发送和接收低速串口数据。系统采用构造简单、功能强大的Modbus协议作为上层通讯协议,保证了系统运行的稳定可靠。实验表明了串口系统的实时性和可靠性良好,为在通信工程的信号采集与传输提供了一种有效的组网技术方案。
  • 所需E币: 1
    时间: 2019-5-24 22:57
    大小: 1.11MB
    上传者: 江畔美少年
    MODBUS协议中文版
广告