1205 lines
26 KiB
C
1205 lines
26 KiB
C
|
|
|
|||
|
|
#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
|
|||
|
|
|