资源简介
可灵活配置为主机或者从机,做为从机时,上电复位后长时间未接收到命令会有一次机会自动转换为主机,与带有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插件
- 下一篇:扩展的欧几里得算法实现求乘法逆元
相关资源
- 51单片机编写的标准modbus协议通信模版
- VC MODBUS协议上位机程序
- MODBUS协议中文完整版+资料
- modbus协议调试工具 支持TCP和串口
- 基于STM32F407ZGT6库函数写的Modbus协议
- Modbus协议的工业自动化网络规范
- STM32单片机实现Modbus协议主机2个源码
- MODBUS协议的上位机与51下位机的温度采
- STM8s读取AM2303温湿度传感器MODBUS协议
- MODBUS协议中文完整版
- modbus协议中文完整高清+modbus源码分析
- modbus协议
- 多块板子利用485总线 采用MODBUS协议实
- Modbus协议规范中文版
- stm32 rs485 modbus协议
- 基于MODBUS协议的直流电机控制程序-
- VC串口通信modbus协议源代码教程
- stm32f407开发板实现485串口modbus协议通
- modbus协议+modbus软件开发实战指南PDF打
- STM32F407上实现Modbus协议,包括多种C
- 基于Modbus协议的工业自动化网络规范
- intouch,Modbus协议驱动
- MODBUS协议中文版.pdf
- stc89c51通过modbus协议与上位机通信
- SMART LINE系列触摸屏通过MODBUS协议直接
- 51单片机485(modbus协议)通信程序
- MODBUS协议 vc实现
- 威纶触摸屏MODBUS协议的测试数据,与
- Modbus协议在TCP/IP上 的实现指南
- STC15系列工控程序带485通讯+Modbus协议
评论
共有 条评论