• 大小: 8KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-19
  • 语言: 其他
  • 标签: modbus协议  

资源简介

可灵活配置为主机或者从机,做为从机时,上电复位后长时间未接收到命令会有一次机会自动转换为主机,与带有modbus协议的外设通信

资源截图

代码片段和文件信息

/********************************************
MCU: STC12C5A60S2
AUTHOR:
VERSION:
TIME:
*********************************************/

#define _MODBUS_GLOBALS_
#include “common.h“

void ModbusInit(void)
{
unsigned char cnt;
RX_485_EN() ;
R_485 = 1;
D_485 = 1;

//参数配置
ModbusPara.sRUN =  MB_IDEL;
ModbusPara.sERR = ERR_NOT;
ModbusPara.times = 0;
ModbusPara.ms_50 = 0;
ModbusPara.rCnt = 0;
ModbusPara.HostRept = 0;
ModbusPara.mAddrs = MB_ConceDevice_ADDR;
for(cnt = 0 ;cnt < LENGTH_MB_DATA ;cnt++)
{
ModbusPara.rBuf[cnt] = 0;
ModbusPara.tBuf[cnt] = 0;
}

for(cnt = 0 ;cnt  {
CoilBitPara[cnt] = 0;
}

for(cnt = 0 ;cnt  {
DiscreteBitPara[cnt] = 0;
}

for(cnt = 0 ;cnt  {
HoldingREGPara[cnt] = 0;
}

for(cnt = 0 ;cnt  {
InputREGPara[cnt] = 0;
}
}

void ModbusTimesProcess(void)
{
ModbusPara.times++;
if(ModbusPara.times == 200) 
{
ModbusPara.ms_50++;
}

cnt1ms ++; //260us
if(cnt1ms%200 == 199) 
{// 50ms
cnt1ms = 0;
bTime100ms ++;
bTsave100ms ++;
bTime1s ++;
bTime50ms ++;
}

if((ModbusPara.sRUN&MB_BUSY) ==  MB_BUSY) 
{// 总线检测
if(ModbusPara.times >= BUS_IDLE_TIME) 
{//总线进入空闲,帧结束或开始
if(ModbusPara.sRUN == MB_RECIVE_ERR)
{// 接收过程中 有出现数据存储空间溢出或间隔时间超过T1.5
ModbusPara.sERR =ERR_MB_DEVICE;
}

if(ModbusPara.sRUN == MB_SEND) 
{
ModbusPara.sRUN = MB_WAIT_HOST;
ModbusPara.ms_50 = 0;
}
else 
{
ModbusPara.sRUN =  MB_IDEL;
}
ModbusPara.times = 0;
}
}
else if(ModbusPara.sRUN ==  MB_WAIT_HOST)
{//等待合法设备响应
if(ModbusPara.ms_50 >= NO_RESPONSE_TIME ||  
(ModbusPara.ms_50 >=NO_RESPONSE_TIME_BC && ModbusPara.mAddrs == MB_Broadcast_ADDR))
{//从设备响应超时
if(ModbusPara.mAddrs == MB_Broadcast_ADDR)
{
ModbusPara.sRUN =  MB_IDEL;
ModbusPara.sERR = ERR_NOT;
}
else
{
ModbusPara.sRUN = MB_NO_RESPONSE;
ModbusPara.sERR = ERR_MB_DEVICE;
}
ModbusPara.ms_50 = 0;
}
}
}

void ModbusSend(unsigned char length) 
{
unsigned char cnt;

TX_485_EN() ;
for(cnt=0; cnt < length; cnt++)
{// test和延时作用
// TxOneData(ModbusPara.tBuf[cnt]);
}

if(length)
{
ModbusPara.sRUN = MB_SEND;
ModbusPara.times = 0;
for(cnt=0; cnt < length; cnt++)
{
usart2_sendb(ModbusPara.tBuf[cnt]);
ModbusPara.times = 0;  //重新计时
}
}
RX_485_EN() ;
}

void Modbus_ERROR(void) 
{
unsigned short  temp16;

if(bHost_protocol)
{
if(ModbusPara.sERR)
{
if(ModbusPara.sERR != ERR_MB_DATA &&  ModbusPara.sERR !=  ERR_MB_DEVICE)
{//  不需要重复发送
ModbusPara.HostRept = 0;
}
if(ModbusPara.HostRept == 0) ModbusPara.sERR= ERR_NOT;
}

if(ModbusPara.HostRept)
{// 重复送
ModbusPara.HostRept --;
if(ModbusPara.tBuf[1] == CHECK_COIL_bSTATUS || ModbusPara.tBuf[1] == GET_INPUT_bSTATUS 
|| ModbusPara.tBuf[

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      28417  2015-03-11 11:19  modbus.c

     文件       6065  2015-03-11 11:19  ModBus.h

     文件       3902  2015-02-12 09:30  ModBusCrc16.c

     文件        239  2015-02-12 09:30  ModBusCrc16.h

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

                38623                    4


评论

共有 条评论