資源簡介
可靈活配置為主機或者從機,做為從機時,上電復位后長時間未接收到命令會有一次機會自動轉換為主機,與帶有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? {
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? {//?test和延時作用
// TxOneData(ModbusPara.tBuf[cnt]);
}
if(length)
{
ModbusPara.sRUN?=?MB_SEND;
ModbusPara.times?=?0;
for(cnt=0;?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插件
- 下一篇:擴展的歐幾里得算法實現求乘法逆元
評論
共有 條評論