optical/NxFuncs/modbus/modbus_s.c

1205 lines
26 KiB
C
Raw Normal View History

2025-09-04 01:45:08 +00:00
#include "modbus_s.h"
#ifdef MODBUS_S_PORT
#include "inout.h"
#include "delay.h"
#include "trigger.h"
//-----------------------------------------------------------------
// <20><><EFBFBD>ƽ
u16 * mdbsReg[MODBUS_REG_MAX - MODBUS_REG_MIN + 1] = {NULL}; // Modbus <20><><EFBFBD><EFBFBD><E8B1B8>ַ<EFBFBD>ռ<EFBFBD>
ModbusCtrl g_modBusSCtrl;
Rs485Ctrl g_rs485SCtrl;
int ModbusSTx(Rs485Cmd * pCmd); // <20><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>MODBUSЭ<53><D0AD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
int ModbusSRx(u8 rDat); // <20><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>MODBUSЭ<53><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int AddModbusSCmd(Rs485Cmd * pCmd); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int GetModbusSCmd(Rs485Cmd * pCmd); // <20>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
int GetModbusSCmdBufLen(void); // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ReadModbusSData(u16 addr, u16 * pBuf, u16 len); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void WriteModbusSData(u16 addr, u16 * pBuf, u16 len); // д<><D0B4><EFBFBD><EFBFBD>
//-----------------------------------------------------------------
/*-----------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> Modbus <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
baud : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dat: <EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
parity: У<EFBFBD><EFBFBD>λ
stop: ֹͣλ
mode: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
*/
void InitModbusS(BAUD_TypeDef baud, char dat, char parity, char stop, char mode)
{
memset(&g_modBusSCtrl, 0, sizeof(ModbusCtrl));
if (mode == 'A' || mode == 'a')
{
g_modBusSCtrl.modBusMode = 1;
}
else
{
g_modBusSCtrl.modBusMode = 0;
}
// <20><>ʱ
switch(baud)
{
// <20><><EFBFBD><EFBFBD>λ + 1<><31><EFBFBD><EFBFBD>ʼλ + <20><>żУ<C5BC><D0A3>λ(<28><>У<EFBFBD><D0A3><EFBFBD><EFBFBD>û<EFBFBD><C3BB>) + ֹͣλ
// <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ͨѶ<CDA8><D1B6>ʱ, <20><>λus = 10000000 / baud(<28><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>10λ<30><CEBB><EFBFBD><EFBFBD>, 8 N 1)
case B4800:
{
g_modBusSCtrl.modBusWait = 2200;
break;
}
case B9600:
{
g_modBusSCtrl.modBusWait = 1100;
break;
}
case B14400:
{
g_modBusSCtrl.modBusWait = 750;
break;
}
case B19200:
{
g_modBusSCtrl.modBusWait = 600;
break;
}
case B38400:
{
g_modBusSCtrl.modBusWait = 300;
break;
}
case B57600:
{
g_modBusSCtrl.modBusWait = 200;
break;
}
case B115200:
{
g_modBusSCtrl.modBusWait = 100;
break;
}
case B230400:
{
g_modBusSCtrl.modBusWait = 50;
break;
}
case B460800:
{
g_modBusSCtrl.modBusWait = 25;
break;
}
case B921600:
{
g_modBusSCtrl.modBusWait = 13;
break;
}
default:
{
g_modBusSCtrl.modBusWait = 0;
}
}
if ((dat == '8') && (parity != 'N') && (parity != 'n')) // 7λ<37><CEBB><EFBFBD>ݹ<EFBFBD><DDB9><EFBFBD>У<EFBFBD><D0A3>λ
{
g_modBusSCtrl.filterChk = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>λ<EFBFBD><CEBB>־ 1, <20><><EFBFBD><EFBFBD>
}
else
{
g_modBusSCtrl.filterChk = 0;
}
#ifndef USART1_485OutEn
#define USART1_485OutEn DefOutEn
#endif
#ifndef USART1_485OutDis
#define USART1_485OutDis DefOutDis
#endif
#ifndef USART2_485OutEn
#define USART2_485OutEn DefOutEn
#endif
#ifndef USART2_485OutDis
#define USART2_485OutDis DefOutDis
#endif
#ifndef USART3_485OutEn
#define USART3_485OutEn DefOutEn
#endif
#ifndef USART3_485OutDis
#define USART3_485OutDis DefOutDis
#endif
#ifndef USART4_485OutEn
#define USART4_485OutEn DefOutEn
#endif
#ifndef USART4_485OutDis
#define USART4_485OutDis DefOutDis
#endif
#ifndef USART5_485OutEn
#define USART5_485OutEn DefOutEn
#endif
#ifndef USART5_485OutDis
#define USART5_485OutDis DefOutDis
#endif
#ifndef USART6_485OutEn
#define USART6_485OutEn DefOutEn
#endif
#ifndef USART6_485OutDis
#define USART6_485OutDis DefOutDis
#endif
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#if (MODBUS_S_PORT == COMM_USART1)
InitUsart1(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>1
RegisterModbusCommFunc(&g_modBusSCtrl, Usart1SendData, Usart1GetData, Usart1CleanRsBuf, IsUsart1SendOver, USART1_485OutEn, USART1_485OutDis);
#elif (MODBUS_S_PORT == COMM_USART2)
InitUsart2(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>2
RegisterModbusCommFunc(&g_modBusSCtrl, Usart2SendData, Usart2GetData, Usart2CleanRsBuf, IsUsart2SendOver, USART2_485OutEn, USART2_485OutDis);
#elif (MODBUS_S_PORT == COMM_USART3)
InitUsart3(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>3
RegisterModbusCommFunc(&g_modBusSCtrl, Usart3SendData, Usart3GetData, Usart3CleanRsBuf, IsUsart3SendOver, USART3_485OutEn, USART3_485OutDis);
#elif (MODBUS_S_PORT == COMM_USART4)
InitUsart4(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>4
RegisterModbusCommFunc(&g_modBusSCtrl, Usart4SendData, Usart4GetData, Usart4CleanRsBuf, IsUsart4SendOver, USART4_485OutEn, USART4_485OutDis);
#elif (MODBUS_S_PORT == COMM_USART5)
InitUsart5(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>5
RegisterModbusCommFunc(&g_modBusSCtrl, Usart5SendData, Usart5GetData, Usart5CleanRsBuf, IsUsart5SendOver, USART5_485OutEn, USART5_485OutDis);
#elif (MODBUS_S_PORT == COMM_USART6)
InitUsart6(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>6
RegisterModbusCommFunc(&g_modBusSCtrl, Usart6SendData, Usart6GetData, Usart6CleanRsBuf, IsUsart6SendOver, USART6_485OutEn, USART6_485OutDis);
#else
RegisterModbusCommFunc(&g_modBusSCtrl, DefSendData, DefGetData, DefCleanRsBuf, DefIsSendOver, DefOutEn, DefOutDis);
#endif
g_modBusSCtrl.CommOutDis(); // <20>رշ<D8B1><D5B7><EFBFBD>
}
/*-----------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ASCII<EFBFBD><EFBFBD>ʽMODBUSЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>Ӧ03<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int Modbus_TX03A(Rs485Cmd * pCmd)
{
int i = 0;
u8 pSDat[MDBSRXLEN_A]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 Lrc_check = 0; // <20><>У<EFBFBD><D0A3>
u16 data[MODBUS_REG_MAX - MODBUS_REG_MIN + 1] = {0};
u8 temp; // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
u8 temp_data; // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
if (pCmd == NULL)
{
return -1;
}
pSDat[i++] = ':'; //':'
temp_data = pCmd->index;
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //IDX_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //IDX_L
Lrc_check += temp_data;
temp_data = pCmd->cmd;
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //CMD_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //CMD_L
Lrc_check += temp_data;
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
temp_data = pCmd->rlen << 1;
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Bytes Count_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Bytes Count_L
Lrc_check += temp_data;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
ReadModbusSData(pCmd->addr, &data[0], pCmd->rlen);
for (int j = 0; j < pCmd->rlen; j++)
{
temp_data = HIBYTE(data[j]);
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp);
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp);
Lrc_check += temp_data;
temp_data = LOBYTE(data[j]);
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp);
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp);
Lrc_check += temp_data;
}
Lrc_check = ~Lrc_check + 1;
pSDat[i++] = RtuToAscii(HIHFBYTE(Lrc_check)); //LRC_H
pSDat[i++] = RtuToAscii(LOHFBYTE(Lrc_check)); //LRC_L
pSDat[i++] = 0x0D; //CR
pSDat[i++] = 0x0A; //LF
g_modBusSCtrl.ModBusCommSend(pSDat, i); // <20><><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
/*-----------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ASCII<EFBFBD><EFBFBD>ʽMODBUSЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>Ӧ06<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int Modbus_TX06A(Rs485Cmd * pCmd)
{
int i = 0;
u8 pSDat[MDBSRXLEN_A]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 Lrc_check = 0; //<2F><>У<EFBFBD><D0A3>
u8 temp; //<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
u8 temp_data; //<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
if (pCmd == NULL)
{
return -1;
}
pSDat[i++] = ':'; //':'
temp_data = pCmd->index;
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //IDX_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //IDX_L
Lrc_check += temp_data;
temp_data = pCmd->cmd;
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //CMD_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //CMD_L
Lrc_check += temp_data;
temp_data = HIBYTE(pCmd->addr);
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Addr_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Addr_L
Lrc_check += temp_data;
temp_data = LOBYTE(pCmd->addr);
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Addr_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Addr_L
Lrc_check += temp_data;
temp_data = HIBYTE(pCmd->wrdat[0]);
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Data_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Data_L
Lrc_check += temp_data;
temp_data = LOBYTE(pCmd->wrdat[0]);
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Data_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Data_L
Lrc_check += temp_data;
Lrc_check = ~Lrc_check + 1;
pSDat[i++] = RtuToAscii(HIHFBYTE(Lrc_check)); //LRC_H
pSDat[i++] = RtuToAscii(LOHFBYTE(Lrc_check)); //LRC_L
pSDat[i++] = 0x0D; //CR
pSDat[i++] = 0x0A; //LF
g_modBusSCtrl.ModBusCommSend(pSDat, i); // <20><><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
/*-----------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ASCII<EFBFBD><EFBFBD>ʽMODBUSЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>Ӧ10H<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int Modbus_TX10A(Rs485Cmd * pCmd)
{
int i = 0;
u8 pSDat[MDBSRXLEN_A]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 Lrc_check = 0; //<2F><>У<EFBFBD><D0A3>
u8 temp; //<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
u8 temp_data; //<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
if (pCmd == NULL)
{
return -1;
}
pSDat[i++] = ':'; //':'
temp_data = pCmd->index;
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //IDX_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //IDX_L
Lrc_check += temp_data;
temp_data = pCmd->cmd;
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //CMD_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //CMD_L
Lrc_check += temp_data;
temp_data = HIBYTE(pCmd->addr);
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Addr_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Addr_L
Lrc_check += temp_data;
temp_data = LOBYTE(pCmd->addr);
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Addr_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //Addr_L
Lrc_check += temp_data;
temp_data = HIBYTE(pCmd->wlen);
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //len_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //len_L
Lrc_check += temp_data;
temp_data = LOBYTE(pCmd->wlen);
temp = HIHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //len_H
temp = LOHFBYTE(temp_data);
pSDat[i++] = RtuToAscii(temp); //len_L
Lrc_check += temp_data;
Lrc_check = ~Lrc_check + 1;
pSDat[i++] = RtuToAscii(HIHFBYTE(Lrc_check)); //LRC_H
pSDat[i++] = RtuToAscii(LOHFBYTE(Lrc_check)); //LRC_L
pSDat[i++] = 0x0D; //CR
pSDat[i++] = 0x0A; //LF
g_modBusSCtrl.ModBusCommSend(pSDat, i); // <20><><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
/*-----------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>RTU<EFBFBD><EFBFBD>ʽMODBUSЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>Ӧ03<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int Modbus_TX03R(Rs485Cmd * pCmd)
{
int i = 0;
u8 pSDat[MDBSRXLEN_R]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u16 checkcrc; //crcУ<63><D0A3>
u16 data[MODBUS_REG_MAX - MODBUS_REG_MIN + 1] = {0};
if (pCmd == NULL)
{
return -1;
}
pSDat[i++] = pCmd->index; // ADR
pSDat[i++] = pCmd->cmd; // CMD
pSDat[i++] = pCmd->rlen << 1; // <20>ֽ<EFBFBD><D6BD><EFBFBD>
ReadModbusSData(pCmd->addr, &data[0], pCmd->rlen);
for (int j = 0; j < pCmd->rlen; j++)
{
pSDat[i++] = HIBYTE(data[j]); // DATA_H
pSDat[i++] = LOBYTE(data[j]); // DATA_L
}
checkcrc = ModbusCrc16(&pSDat[0], i);
pSDat[i++] = HIBYTE(checkcrc); // CRC_H
pSDat[i++] = LOBYTE(checkcrc); // CRC_L
g_modBusSCtrl.ModBusCommSend(pSDat, i); // <20><><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
/*-----------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>RTU<EFBFBD><EFBFBD>ʽMODBUSЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>Ӧ06<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int Modbus_TX06R(Rs485Cmd * pCmd)
{
int i = 0;
u8 pSDat[MDBSRXLEN_R]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u16 checkcrc; //crcУ<63><D0A3>
if (pCmd == NULL)
{
return -1;
}
pSDat[i++] = pCmd->index; // ADR
pSDat[i++] = pCmd->cmd; // CMD
pSDat[i++] = HIBYTE(pCmd->addr); // ADDR_H
pSDat[i++] = LOBYTE(pCmd->addr); // ADDR_L
pSDat[i++] = HIBYTE(pCmd->wrdat[0]); // DATA_H
pSDat[i++] = LOBYTE(pCmd->wrdat[0]); // DATA_L
checkcrc = ModbusCrc16(&pSDat[0], i);
pSDat[i++] = HIBYTE(checkcrc); // CRC_H
pSDat[i++] = LOBYTE(checkcrc); // CRC_L
g_modBusSCtrl.ModBusCommSend(pSDat, i); // <20><><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
/*-----------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>RTU<EFBFBD><EFBFBD>ʽMODBUSЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>Ӧ10H<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
int Modbus_TX10R(Rs485Cmd * pCmd)
{
int i = 0;
u8 pSDat[MDBSRXLEN_R]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 checkcrc; //crcУ<63><D0A3>
if (pCmd == NULL)
{
return -1;
}
pSDat[i++] = pCmd->index; // ADR
pSDat[i++] = pCmd->cmd; // CMD
pSDat[i++] = HIBYTE(pCmd->addr); // ADDR_H
pSDat[i++] = LOBYTE(pCmd->addr); // ADDR_L
// <20><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>,<2C><>λ<EFBFBD><CEBB>
pSDat[i++] = HIBYTE(pCmd->wlen); // LEN_H
pSDat[i++] = LOBYTE(pCmd->wlen); // LEN_L
checkcrc = ModbusCrc16(&pSDat[0], i);
pSDat[i++] = HIBYTE(checkcrc); // CRC_H
pSDat[i++] = LOBYTE(checkcrc); // CRC_L
g_modBusSCtrl.ModBusCommSend(pSDat, i); // <20><><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
//-----------------------------------------------------------------
// <20><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>MODBUSЭ<53><D0AD><EFBFBD>Ļذ<C4BB>,<2C><><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>: pCmd:
// <20><><EFBFBD><EFBFBD>ֵ: 0:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// -1:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ModbusSTx(Rs485Cmd * pCmd)
{
int result = 0;
u8 cmd;
if (pCmd == NULL)
{
return -1;
}
cmd = pCmd->cmd;
if ((cmd != MODBUS_RD) &&
(cmd != MODBUS_WR) &&
(cmd != MODBUS_WR_MULTI) &&
1)
{
return -1;
}
if (pCmd->index != 0 &&
((pCmd->index & 0x80) == 0 || cmd == MODBUS_RD) &&
1)
{
if (g_modBusSCtrl.modBusMode != 0)
{// ASCII<49><49>ģʽ
if (cmd == MODBUS_RD)
{
Modbus_TX03A(pCmd);
}
else if (cmd == MODBUS_WR)
{
Modbus_TX06A(pCmd);
}
else if (cmd == MODBUS_WR_MULTI)
{
Modbus_TX10A(pCmd);
}
}
else
{// RTUģʽ
if (cmd == MODBUS_RD)
{
Modbus_TX03R(pCmd);
}
else if (cmd == MODBUS_WR)
{
Modbus_TX06R(pCmd);
}
else if (cmd == MODBUS_WR_MULTI)
{
Modbus_TX10R(pCmd);
}
}
}
return result;
}
//-----------------------------------------------------------------
// <20><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>MODBUSЭ<53><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>:
// rDat: <09><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ֵ: 0: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Rs485Cmd cmdbuf[MAX_485CMD] <20><>)
int ModbusSRx(u8 rDat)
{
int i;
int rst = -1;
u32 time;
static u32 timeBuf = 0;
static u8 rxDat[MDBSRXLEN_MAX] = {0}; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
static u8 beg = 0; // <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ʼ<EFBFBD><CABC>
static u16 idx = 0; // <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
static u16 num = 0; // <20><><EFBFBD>յ<EFBFBD><D5B5>ַ<EFBFBD><D6B7><EFBFBD>
static u8 rxDat_H = 0; // <20><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
u16 checkcrc = 0; // crcУ<63><D0A3>(RTU)
u8 checksum = 0; // <20><>У<EFBFBD><D0A3>(ASCII)
Rs485Cmd newCmd;
memset(&newCmd, 0, sizeof(Rs485Cmd));
if (g_modBusSCtrl.modBusMode != 0)
{// ASCII<49><49>ģʽ
if (g_modBusSCtrl.filterChk != 0) // 7λ<37><CEBB><EFBFBD>ݹ<EFBFBD><DDB9><EFBFBD>У<EFBFBD><D0A3>λ
{
rDat &= (0x7F);
}
time = GetUsSoftTimer();
if (((time - timeBuf) > (g_modBusSCtrl.modBusWait * g_rs485SCtrl.modrsvTimout)) || // <20><>ȡ<EFBFBD><C8A1>ʱʱ<CAB1><CAB1>
(idx > MDBSRXLEN_A) || // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
0)
{// <20><><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
beg = 0;
idx = 0;
num = 1;
}
else
{
num++;
}
timeBuf = time;
if (((rDat == ':') || (rDat == 0x0D) || (rDat == 0x0A)) ||
((rDat >= '0') && (rDat <= '9')) ||
((rDat >= 'a') && (rDat <= 'f')) ||
((rDat >= 'A') && (rDat <= 'F')) ||
0)
{// <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (beg == 1)
{
idx++;
}
}
else
{// <20><><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
beg = 0;
idx = 0;
}
if (rDat == ':')
{// <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ʼ<EFBFBD><CABC>
beg = 1;
idx = 0;
}
else if (rDat != 0x0A)
{// <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
if ((idx & 0x01) == 0)
{//<2F><><EFBFBD>յ<EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
rxDat[(idx >> 1)-1] = MAKEBYTE(AsciiToRtu(rDat),AsciiToRtu(rxDat_H));
}
else
{//<2F><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>ŵ<EFBFBD><C5B5><EFBFBD>ʱ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>
rxDat_H = rDat;
}
}
else if (rDat == 0x0A) // \n
{// <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ֹ<EFBFBD><D6B9>
if (rxDat_H == 0x0D) // \r
{// <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((idx & 0x01) == 0)
{//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
idx = (idx >> 1) - 2; //ȷ<><C8B7><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(<28><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>λ)
//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
checksum = 0;
for (i = 0; i < idx; i++)
{
checksum += rxDat[i];
}
checksum = ~checksum + 1;
if(checksum == rxDat[idx])
{//lrcУ<63><D0A3><EFBFBD><EFBFBD>ȷ
u8 index = rxDat[0]; // <20><><EFBFBD><EFBFBD>վ<EFBFBD><D5BE>
int cur = 0;
index &= 0x7f;
for (i = 0; i < g_rs485SCtrl.idxNum; i++)
{// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((index == 0) ||
(index == g_rs485SCtrl.idxList[i]) ||
0)
{
cur = 1;
break;
}
}
if(cur == 1)
{//վ<><D5BE><EFBFBD><EFBFBD>ȷ
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
newCmd.index = rxDat[0]; // վ<><D5BE>
newCmd.cmd = rxDat[1]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
newCmd.addr = MAKEWORD(rxDat[3],rxDat[2]); // <20><><EFBFBD>ݵ<EFBFBD>ַ
switch(newCmd.cmd)
{
case MODBUS_RD: // 03H (<28><>ȡ<EFBFBD><C8A1><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>)
{
newCmd.rlen = MAKEWORD(rxDat[5],rxDat[4]); //<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
AddModbusSCmd(&newCmd); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rst = 0;
break;
}
case MODBUS_WR: // 06H (д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>)
{
newCmd.wrdat[0] = MAKEWORD(rxDat[5],rxDat[4]); //<2F><><EFBFBD><EFBFBD>
newCmd.wlen = 1; //<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
AddModbusSCmd(&newCmd); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rst = 0;
break;
}
case MODBUS_WR_MULTI: // 10H (д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>)
{
newCmd.wlen = MAKEWORD(rxDat[5],rxDat[4]); //<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
for (i = 0; i < (rxDat[6]/2); i++)
{
newCmd.wrdat[i] = MAKEWORD(rxDat[i*2+8],rxDat[i*2+7]); //<2F><><EFBFBD><EFBFBD>
}
AddModbusSCmd(&newCmd); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rst = 0;
break;
}
default:
break;
} //switch(newCmd.cmd)
} //if (cur == 1)
} //if (checksum == rxDat[idx])
} //if ((idx & 0x01) == 0)
} //if (rxDat_H == 0x0D)
idx = 0;
beg = 0; // <20><><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
} //if (rDat == 0x0A)
}
else
{// RTUģʽ
time = GetUsSoftTimer();
if (((time - timeBuf) > (g_modBusSCtrl.modBusWait * g_rs485SCtrl.modrsvTimout)) || // <20><>ȡ<EFBFBD><C8A1>ʱʱ<CAB1><CAB1>
(idx > (MDBSRXLEN_R)) || // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
0)
{// <20><><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
if (num > 1)
{
printf("data packet restart, old num=%d, rDat=0x%x\r\n", num, rDat);
}
idx = 0;
num = 1;
}
else
{
num++;
}
timeBuf = time;
int receive = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־
if (num < 8) // <20><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
{
rxDat[idx] = rDat;
idx++;
}
else if (num >= 8)
{
u16 len;
if (rxDat[1] == MODBUS_WR_MULTI)
{
len = 9 + rxDat[6];
}
else
{
len = 8;
}
if (num < len) // <20><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
{
rxDat[idx] = rDat;
idx++;
}
else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
rxDat[idx] = rDat;
receive = 1;
}
}
if (receive == 1)
{
/*
printf("receive a RTU modbus packet:");
for (int j = 0; j < num; j++)
{
printf("\t0x%x", rxDat[j]);
}
printf("\r\n");
*/
//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
checkcrc = ModbusCrc16(&rxDat[0], num-2);
if (rxDat[num-2] == HIBYTE(checkcrc) && rxDat[num-1] == LOBYTE(checkcrc))
{//crcУ<63><D0A3><EFBFBD><EFBFBD>ȷ
u8 index = rxDat[0]; // վ<><D5BE>
int cur = 0;
index &= 0x7f; // ֻ<><D6BB><EFBFBD><EFBFBD>С<EFBFBD><D0A1>128<32><38>վ<EFBFBD><D5BE>
for (i = 0; i < g_rs485SCtrl.idxNum; i++)
{// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((index == 0) ||
(index == g_rs485SCtrl.idxList[i]) ||
0)
{
cur = 1;
break;
}
}
if(cur == 1)
{//վ<><D5BE><EFBFBD><EFBFBD>ȷ
newCmd.index = rxDat[0]; // վ<><D5BE>
newCmd.cmd = rxDat[1]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
newCmd.addr = MAKEWORD(rxDat[3],rxDat[2]); // <20><><EFBFBD>ݵ<EFBFBD>ַ
switch(newCmd.cmd)
{
case MODBUS_RD: // 03H (<28><>ȡ<EFBFBD><C8A1><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>)
{
newCmd.rlen = MAKEWORD(rxDat[5],rxDat[4]); //<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
AddModbusSCmd(&newCmd); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rst = 0;
break;
}
case MODBUS_WR: // 06H (д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>)
{
newCmd.wrdat[0] = MAKEWORD(rxDat[5],rxDat[4]); //<2F><><EFBFBD><EFBFBD>
newCmd.wlen = 1; //<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
AddModbusSCmd(&newCmd); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rst = 0;
break;
}
case MODBUS_WR_MULTI: // 10H (д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ּĴ<D6BC><C4B4><EFBFBD>)
{
newCmd.wlen = MAKEWORD(rxDat[5],rxDat[4]); //<2F><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
for (i = 0; i < newCmd.wlen; i++)
{
newCmd.wrdat[i] = MAKEWORD(rxDat[8+i*2], rxDat[7+i*2]); //<2F><><EFBFBD><EFBFBD>
}
AddModbusSCmd(&newCmd); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rst = 0;
break;
}
default:
break;
}
}
else
{
printf("index error, index=%d\r\n", index);
}
}
else
{
printf("check crc error, calc crc:0x%x 0x%x, receive crc:0x%x 0x%x\r\n",
HIBYTE(checkcrc), LOBYTE(checkcrc), rxDat[num-2], rxDat[num-1]);
}
idx = 0;
num = 0; // <20><><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
}
}
return rst;
}
//-----------------------------------------------------------------
// idx <20><>վ<EFBFBD><D5BE>
void InitModbusSCtrl(u8 idx, int rsvtimout)
{
memset(&g_rs485SCtrl, 0, sizeof(Rs485Ctrl));
g_rs485SCtrl.init = 1; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
g_rs485SCtrl.idxList[g_rs485SCtrl.idxNum] = idx; // վ<><D5BE>
g_rs485SCtrl.idxNum++;
// <20><>ȡ<EFBFBD><C8A1>ʱʱ<CAB1><CAB1>
if (rsvtimout < 10)
{
g_rs485SCtrl.modrsvTimout = 10;
}
else if (rsvtimout > 100)
{
g_rs485SCtrl.modrsvTimout = 100;
}
else
{
g_rs485SCtrl.modrsvTimout = rsvtimout;
}
}
// ע<><D7A2><EFBFBD>ⲿ<EFBFBD><E2B2BF>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
void RegModbusSCmdProc(Resv485ExProc exProc)
{
g_rs485SCtrl.resv485exproc = exProc;
}
// <20><><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD>վ<EFBFBD><D5BE>
void AddModbusSIdx(u8 idx)
{
if (g_rs485SCtrl.idxNum < MODBUS_IDXMAX)
{
g_rs485SCtrl.idxList[g_rs485SCtrl.idxNum] = idx; // վ<><D5BE>
g_rs485SCtrl.idxNum++;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int AddModbusSCmd(Rs485Cmd * pCmd)
{
Rs485Ctrl * p485Ctrl = &g_rs485SCtrl;
if (p485Ctrl != NULL && pCmd != NULL)
{
if (p485Ctrl->bufCmdNum < MAX_485CMD && p485Ctrl->bufTail < MAX_485CMD)
{
memcpy(&(p485Ctrl->cmdbuf[p485Ctrl->bufTail]), pCmd, sizeof(Rs485Cmd));
p485Ctrl->bufTail++;
if (p485Ctrl->bufTail >= MAX_485CMD)
{
p485Ctrl->bufTail = 0;
}
p485Ctrl->bufCmdNum++;
return p485Ctrl->bufCmdNum;
}
return -2;
}
return -1;
}
// <20>õ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
int GetModbusSCmd(Rs485Cmd * pCmd)
{
Rs485Ctrl * p485Ctrl = &g_rs485SCtrl;
if (p485Ctrl != NULL && pCmd != NULL)
{
if (p485Ctrl->bufCmdNum > 0 && p485Ctrl->bufHead < MAX_485CMD)
{
memcpy(pCmd, &(p485Ctrl->cmdbuf[p485Ctrl->bufHead]), sizeof(Rs485Cmd));
p485Ctrl->bufHead++;
if (p485Ctrl->bufHead >= MAX_485CMD)
{
p485Ctrl->bufHead = 0;
}
p485Ctrl->bufCmdNum--;
return p485Ctrl->bufCmdNum;
}
else
{
return -2;
}
}
return -1;
}
int GetModbusSCmdBufLen(void)
{
return g_rs485SCtrl.bufCmdNum;
}
// modbus<75><73><EFBFBD>豸,<2C><EFBFBD><ECB2BD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
int ModbusSTask(void)
{
static u32 lastTime; // <20><>λus
static Rs485Cmd cmd;
Rs485Ctrl * p485Ctrl = &g_rs485SCtrl;
if (p485Ctrl == NULL)
{
return -1;
}
if (p485Ctrl->init == 0)
{// û<>г<EFBFBD>ʼ<EFBFBD><CABC><><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return -1;
}
switch(p485Ctrl->steps)
{
case 0: // <20><><EFBFBD><EFBFBD>״̬
{
if (1)
{// <20><><EFBFBD>մ<EFBFBD><D5B4>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 rDat;
int len;
int rslt;
do
{
len = g_modBusSCtrl.ModBusCommReceive(&rDat, 1); // <20>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
if (len == 1)
{// <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rslt = ModbusSRx(rDat);
if (rslt == 0)
{// <20><><EFBFBD>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
break;
}
}
else
{
break;
}
}while(1);
}
if (GetModbusSCmdBufLen() != 0)// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
memset(&cmd, 0, sizeof(Rs485Cmd));
GetModbusSCmd(&cmd); // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>
if (cmd.index != 0 &&
((cmd.index & 0x80) == 0 || cmd.cmd == MODBUS_RD) &&
1)
{// <20><>Ҫ<EFBFBD>ذ<EFBFBD>
lastTime = GetUsSoftTimer();
p485Ctrl->steps++;
}
else
{// <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD>ذ<EFBFBD>
p485Ctrl->steps = 5;
}
}
break;
}
case 1: // <20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if ((GetUsSoftTimer() - lastTime) > (g_modBusSCtrl.modBusWait * 2))
{
g_modBusSCtrl.CommOutEn();
lastTime = GetUsSoftTimer();
p485Ctrl->steps++;
}
break;
}
case 2: // <20><><EFBFBD><EFBFBD><EFBFBD>ذ<EFBFBD><D8B0><EFBFBD><EFBFBD><EFBFBD>
{
if (GetUsSoftTimer() - lastTime > 100)
{
ModbusSTx(&cmd);
p485Ctrl->steps++;
}
break;
}
case 3: // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (g_modBusSCtrl.IsModBusCommSendOver() == TRUE)
{
lastTime = GetUsSoftTimer();
p485Ctrl->steps++;
}
break;
}
case 4: // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽڷ<D6BD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if ((GetUsSoftTimer() - lastTime) > (g_modBusSCtrl.modBusWait * 2))
{
p485Ctrl->steps++;
}
break;
}
case 5: // ִ<><D6B4><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>
{
g_modBusSCtrl.CommOutDis(); // <20><><EFBFBD>ݷ<EFBFBD><DDB7>ͽ<EFBFBD>ֹ
if (cmd.cmd == MODBUS_WR || cmd.cmd == MODBUS_WR_MULTI)
{
WriteModbusSData(cmd.addr, &cmd.wrdat[0], cmd.wlen);
}
if (g_rs485SCtrl.resv485exproc != NULL)
{
g_rs485SCtrl.resv485exproc(&cmd);
}
else
{
printf("resv485exproc is NULL\r\n");
}
p485Ctrl->steps = 0;
break;
}
default:
{
g_modBusSCtrl.CommOutDis(); // <20><><EFBFBD>ݷ<EFBFBD><DDB7>ͽ<EFBFBD>ֹ
p485Ctrl->steps = 0;
break;
}
}
return p485Ctrl->steps;
}
//------------------------------------------------------------------------------------------
// <20><>ʼ<EFBFBD><CABC><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>
int InitModbusReg(u16 addr, u16 * pBuf, u16 len)
{
if (len != 0 && pBuf != NULL)
{
if ((addr + len - 1) > MODBUS_REG_MAX)
{
printf("[Warning]: modbus addr outsize !! addr=0x%x, max=0x%x\r\n", (addr + len - 1), MODBUS_REG_MAX);
}
else if (addr < MODBUS_REG_MIN)
{
printf("[Warning]: modbus addr outsize !! addr=0x%x, min=0x%x\r\n", addr, MODBUS_REG_MIN);
}
else
{
for (int i = addr; i < (addr+len); i++)
{
mdbsReg[i - MODBUS_REG_MIN] = pBuf++;
}
return len;
}
}
return 0;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ReadModbusSData(u16 addr, u16 * pBuf, u16 len)
{
if (len != 0 && pBuf != NULL)
{
if ((addr + len - 1) > MODBUS_REG_MAX)
{
printf("[Warning]: modbus addr outsize !! addr=0x%x, max=0x%x\r\n", (addr + len - 1), MODBUS_REG_MAX);
}
else if (addr < MODBUS_REG_MIN)
{
printf("[Warning]: modbus addr outsize !! addr=0x%x, min=0x%x\r\n", addr, MODBUS_REG_MIN);
}
else
{
for (int i = addr; i < (addr+len); i++)
{
if (mdbsReg[i - MODBUS_REG_MIN] == NULL)
{
printf("[Warning]: modbus addr NULL !! addr=0x%x\r\n", i);
}
else
{
*pBuf++ = *mdbsReg[i - MODBUS_REG_MIN];
}
}
}
}
}
// д<><D0B4><EFBFBD><EFBFBD>
void WriteModbusSData(u16 addr, u16 * pBuf, u16 len)
{
if (len != 0 && pBuf != NULL)
{
if ((addr + len - 1) > MODBUS_REG_MAX)
{
//printf("[Warning]: modbus addr outsize !! addr=0x%x, max=0x%x\r\n", (addr + len - 1), MODBUS_REG_MAX);
}
else if (addr < MODBUS_REG_MIN)
{
//printf("[Warning]: modbus addr outsize !! addr=0x%x, min=0x%x\r\n", addr, MODBUS_REG_MIN);
}
else
{
for (int i = addr; i < (addr+len); i++)
{
if (mdbsReg[i - MODBUS_REG_MIN] == NULL)
{
//printf("[Warning]: modbus addr NULL !! addr=0x%x\r\n", i);
}
else
{
*mdbsReg[i - MODBUS_REG_MIN] = *pBuf++;
}
}
}
}
}
#endif