资源简介
可灵活配置为主机或者从机,做为从机时,上电复位后长时间未接收到命令会有一次机会自动转换为主机,与带有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
- 上一篇:jmeter tps插件
- 下一篇:扩展的欧几里得算法实现求乘法逆元
相关资源
- STC15系列工控程序带485通讯+Modbus协议
- labview +modbus协议的实现
- Modbus协议(最全版)
- 基于modbus协议的PLC与LabVIEW的通讯实现
- Modbus协议官方文档中、英文全
- Modbus协议中文版完整版清晰版
- 串口调试助手带modbus协议
- STM32F030F4P6串口通讯,modbus协议,IIC
- Modbus协议规范英文原版
- C程序MODBUS协议
- labview modbus协议读寄存器
- 使用ifix的MB1驱动与标准MODBUS协议设备
- 通信大全开发源代码含modbus协议
- ARDUINO单片机ARDUINO单片机串口通讯.z
- STM32实现Modbus协议主机源代码
- swt页面后台多线程接受ModBUS协议Sock
- modbus协议开源库libmodbus
- STM32实现Modbus协议主机源码.rar
- ModBus协议测试+模拟器+解析函数库
- 基于qt5下的modbus协议库
评论
共有 条评论