1248 lines
25 KiB
C
1248 lines
25 KiB
C
|
|
|
|||
|
|
#include "modbus_m.h"
|
|||
|
|
|
|||
|
|
#ifdef MODBUS_M
|
|||
|
|
|
|||
|
|
#include "inout.h"
|
|||
|
|
#include "delay.h"
|
|||
|
|
#include "trigger.h"
|
|||
|
|
|
|||
|
|
#ifndef MODBUS_M_NUM
|
|||
|
|
#define MODBUS_M_NUM 1
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------
|
|||
|
|
// <20><><EFBFBD>ƽṹ
|
|||
|
|
ModbusCtrl g_modBusMCtrl[MODBUS_M_NUM];
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*-----------------------------------------------------------------
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> Modbus <EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
midx : <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 InitModbus_m(int midx, int usart, BAUD_TypeDef baud, char dat, char parity, char stop, char mode)
|
|||
|
|
{
|
|||
|
|
if (midx < 0 || midx >= MODBUS_M_NUM)
|
|||
|
|
{
|
|||
|
|
printf("init modbus_m, idx error\r\n");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
memset(&g_modBusMCtrl[midx], 0, sizeof(ModbusCtrl));
|
|||
|
|
|
|||
|
|
if (mode == 'A' || mode == 'a')
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].modBusMode = 1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].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_modBusMCtrl[midx].modBusWait = 2200;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case B9600:
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].modBusWait = 1100;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case B14400:
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].modBusWait = 750;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case B19200:
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].modBusWait = 600;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case B38400:
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].modBusWait = 300;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case B57600:
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].modBusWait = 200;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case B115200:
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].modBusWait = 100;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case B230400:
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].modBusWait = 50;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case B460800:
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].modBusWait = 25;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
case B921600:
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].modBusWait = 13;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
default:
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].modBusWait = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if ((dat == '8') && (parity != 'N') && (parity != 'n')) // 7λ<37><CEBB><EFBFBD>ݹ<EFBFBD><DDB9><EFBFBD>У<EFBFBD><D0A3>λ
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].filterChk = 1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].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>
|
|||
|
|
switch(usart)
|
|||
|
|
{
|
|||
|
|
#ifdef COMM_USART1
|
|||
|
|
case COMM_USART1:
|
|||
|
|
{
|
|||
|
|
InitUsart1(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>1
|
|||
|
|
RegisterModbusCommFunc(&g_modBusMCtrl[midx], Usart1SendData, Usart1GetData, Usart1CleanRsBuf, IsUsart1SendOver, USART1_485OutEn, USART1_485OutDis);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
#ifdef COMM_USART2
|
|||
|
|
case COMM_USART2:
|
|||
|
|
{
|
|||
|
|
InitUsart2(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>2
|
|||
|
|
RegisterModbusCommFunc(&g_modBusMCtrl[midx], Usart2SendData, Usart2GetData, Usart2CleanRsBuf, IsUsart2SendOver, USART2_485OutEn, USART2_485OutDis);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
#ifdef COMM_USART3
|
|||
|
|
case COMM_USART3:
|
|||
|
|
{
|
|||
|
|
InitUsart3(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>3
|
|||
|
|
RegisterModbusCommFunc(&g_modBusMCtrl[midx], Usart3SendData, Usart3GetData, Usart3CleanRsBuf, IsUsart3SendOver, USART3_485OutEn, USART3_485OutDis);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
#ifdef COMM_USART4
|
|||
|
|
case COMM_USART4:
|
|||
|
|
{
|
|||
|
|
InitUsart4(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>4
|
|||
|
|
RegisterModbusCommFunc(&g_modBusMCtrl[midx], Usart4SendData, Usart4GetData, Usart4CleanRsBuf, IsUsart4SendOver, USART4_485OutEn, USART4_485OutDis);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
#ifdef COMM_USART5
|
|||
|
|
case COMM_USART5:
|
|||
|
|
{
|
|||
|
|
InitUsart5(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>5
|
|||
|
|
RegisterModbusCommFunc(&g_modBusMCtrl[midx], Usart5SendData, Usart5GetData, Usart5CleanRsBuf, IsUsart5SendOver, USART5_485OutEn, USART5_485OutDis);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
#ifdef COMM_USART6
|
|||
|
|
case COMM_USART6:
|
|||
|
|
{
|
|||
|
|
InitUsart6(baud, dat, parity, stop); // <20><><EFBFBD><EFBFBD>6
|
|||
|
|
RegisterModbusCommFunc(&g_modBusMCtrl[midx], Usart6SendData, Usart6GetData, Usart6CleanRsBuf, IsUsart6SendOver, USART6_485OutEn, USART6_485OutDis);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
default:
|
|||
|
|
{
|
|||
|
|
RegisterModbusCommFunc(&g_modBusMCtrl[midx], DefSendData, DefGetData, DefCleanRsBuf, DefIsSendOver, DefOutEn, DefOutDis);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
g_modBusMCtrl[midx].CommOutDis(); // <20>رշ<D8B1><D5B7><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>MODBUSЭ<53><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:
|
|||
|
|
// midx: <09><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD>
|
|||
|
|
// index: վ<><D5BE>: 1~247(ʮ<><CAAE><EFBFBD><EFBFBD>)
|
|||
|
|
// cmd: <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 03H (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
// 06H (д<><D0B4><EFBFBD><EFBFBD>)
|
|||
|
|
// 10H (д<><D0B4><EFBFBD><EFBFBD>)
|
|||
|
|
// addr: <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ: 0000H~FFFFH
|
|||
|
|
// pData: <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <09><>λ:<3A><>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>,д<><D0B4><EFBFBD><EFBFBD>ʱΪд<CEAA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
// len: <09><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,<2C><>λ<EFBFBD><CEBB>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>̶<EFBFBD>Ϊ1,д<><D0B4><EFBFBD><EFBFBD>ʱΪд<CEAA>볤<EFBFBD><EBB3A4>
|
|||
|
|
// steps<70><73> <20><><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ֵ: 0:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -1: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -2: <20><><EFBFBD>ͳ<EFBFBD>ʱ
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>Է<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(1--4)<29><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
|||
|
|
// steps == -1, <20>Ƿֲ<C7B7><D6B2><EFBFBD><EFBFBD>ã<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
|
|||
|
|
/*
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>1:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>2:<EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>3:<EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>4:<EFBFBD>رշ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
int ModbusTx(int midx, u8 index, u8 cmd, u16 addr, u16 * pData, u16 len, int steps)
|
|||
|
|
{
|
|||
|
|
int i, j, timeout, result;
|
|||
|
|
u8 checksum, temp; // <20><>У<EFBFBD><D0A3>(ASCII)
|
|||
|
|
u16 checkcrc; // CRC У<><D0A3>(RTU)
|
|||
|
|
u16 data;
|
|||
|
|
u8 pSDat[MDBSRXLEN_MAX]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if ((cmd != MODBUS_RD) && (cmd != MODBUS_WR) && (cmd != MODBUS_WR_MULTI))
|
|||
|
|
{
|
|||
|
|
result = -1;
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (pData == NULL || len == 0)
|
|||
|
|
{
|
|||
|
|
result = -1;
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (midx < 0 || midx >= MODBUS_M_NUM)
|
|||
|
|
{
|
|||
|
|
result = -1;
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (steps == 1 || steps == -1)
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].CommOutEn(); // <20><EFBFBD><F2BFAAB7><EFBFBD>
|
|||
|
|
|
|||
|
|
if (steps == -1)
|
|||
|
|
{
|
|||
|
|
DelayUs(100);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (steps == 2 || steps == -1)
|
|||
|
|
{
|
|||
|
|
i = 0;
|
|||
|
|
result = 0;
|
|||
|
|
|
|||
|
|
if (g_modBusMCtrl[midx].modBusMode != 0) // ASCII<49><49>ģʽ
|
|||
|
|
{
|
|||
|
|
checksum = 0;
|
|||
|
|
pSDat[i++] = ':'; //':'
|
|||
|
|
|
|||
|
|
temp = HIHFBYTE(index);
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // IDX_H
|
|||
|
|
temp = LOHFBYTE(index);
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // IDX_L
|
|||
|
|
checksum += index;
|
|||
|
|
|
|||
|
|
temp = HIHFBYTE(cmd);
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // CMD_H
|
|||
|
|
temp = LOHFBYTE(cmd);
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // CMD_L
|
|||
|
|
checksum += cmd;
|
|||
|
|
|
|||
|
|
temp = HIHFBYTE(HIBYTE(addr));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // ADDR_HH
|
|||
|
|
temp = LOHFBYTE(HIBYTE(addr));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // ADDR_HL
|
|||
|
|
checksum += HIBYTE(addr);
|
|||
|
|
|
|||
|
|
temp = HIHFBYTE(LOBYTE(addr));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // ADDR_LH
|
|||
|
|
temp = LOHFBYTE(LOBYTE(addr));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // ADDR_LL
|
|||
|
|
checksum += LOBYTE(addr);
|
|||
|
|
|
|||
|
|
if (cmd == MODBUS_WR_MULTI)
|
|||
|
|
{//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>,<2C><>λ<EFBFBD><CEBB>
|
|||
|
|
temp = HIHFBYTE(HIBYTE(len));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // LEN_HH
|
|||
|
|
temp = LOHFBYTE(HIBYTE(len));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // LEN_HL
|
|||
|
|
checksum += HIBYTE(len);
|
|||
|
|
|
|||
|
|
temp = HIHFBYTE(LOBYTE(len));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // LEN_LH
|
|||
|
|
temp = LOHFBYTE(LOBYTE(len));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // LEN_LL
|
|||
|
|
checksum += LOBYTE(len);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
|
temp = HIHFBYTE(LOBYTE(len)<<1);
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // LEN_H
|
|||
|
|
temp = LOHFBYTE(LOBYTE(len)<<1);
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // LEN_L
|
|||
|
|
checksum += LOBYTE(len<<1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (j = 0; j < len; j++)
|
|||
|
|
{
|
|||
|
|
data = pData[j];
|
|||
|
|
temp = HIHFBYTE(HIBYTE(data));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // DATA_HH
|
|||
|
|
temp = LOHFBYTE(HIBYTE(data));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // DATA_HL
|
|||
|
|
checksum += HIBYTE(data);
|
|||
|
|
|
|||
|
|
temp = HIHFBYTE(LOBYTE(data));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // DATA_LH
|
|||
|
|
temp = LOHFBYTE(LOBYTE(data));
|
|||
|
|
pSDat[i++] = RtuToAscii(temp); // DATA_LL
|
|||
|
|
|
|||
|
|
checksum += LOBYTE(data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
checksum = ~checksum + 1;
|
|||
|
|
pSDat[i++] = RtuToAscii(HIHFBYTE(checksum)); // LRC_H
|
|||
|
|
pSDat[i++] = RtuToAscii(LOHFBYTE(checksum)); // LRC_L
|
|||
|
|
pSDat[i++] = '\r'; // CR
|
|||
|
|
pSDat[i++] = '\n'; // LF
|
|||
|
|
}
|
|||
|
|
else // RTUģʽ
|
|||
|
|
{
|
|||
|
|
pSDat[i++] = index; // IDX
|
|||
|
|
pSDat[i++] = cmd; // CMD
|
|||
|
|
pSDat[i++] = HIBYTE(addr); // ADDR_H
|
|||
|
|
pSDat[i++] = LOBYTE(addr); // ADDR_L
|
|||
|
|
|
|||
|
|
if (cmd == MODBUS_WR_MULTI)
|
|||
|
|
{//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>,<2C><>λ<EFBFBD><CEBB>
|
|||
|
|
pSDat[i++] = HIBYTE(len); // LEN_H
|
|||
|
|
pSDat[i++] = LOBYTE(len); // LEN_L
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
|
pSDat[i++] = LOBYTE(len)<<1; // LEN_L * 2
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (j = 0; j < len; j++)
|
|||
|
|
{
|
|||
|
|
data = pData[j];
|
|||
|
|
|
|||
|
|
pSDat[i++] = HIBYTE(data); // DATA_H
|
|||
|
|
pSDat[i++] = LOBYTE(data); // DATA_L
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
checkcrc = ModbusCrc16(&pSDat[0], i);
|
|||
|
|
|
|||
|
|
pSDat[i++] = HIBYTE(checkcrc); // CRC_H
|
|||
|
|
pSDat[i++] = LOBYTE(checkcrc); // CRC_L
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
g_modBusMCtrl[midx].ModBusCommSend(pSDat, i);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (steps == 3)
|
|||
|
|
{
|
|||
|
|
if (g_modBusMCtrl[midx].IsModBusCommSendOver() != TRUE)
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (steps == -1) // ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
timeout = (i*2 + 4) * g_modBusMCtrl[midx].modBusWait; // <20><>ʱʱ<CAB1><CAB1>,<2C><>λus((<28>ֽ<EFBFBD><D6BD><EFBFBD>*2 + 4) * ÿ<><C3BF><EFBFBD>ֽڷ<D6BD><DAB7><EFBFBD>ʱ<EFBFBD><CAB1>)
|
|||
|
|
|
|||
|
|
do //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (g_modBusMCtrl[midx].IsModBusCommSendOver() == TRUE)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DelayUs(1);
|
|||
|
|
|
|||
|
|
if (timeout-- <= 0)
|
|||
|
|
{
|
|||
|
|
result = -2;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}while(1);
|
|||
|
|
|
|||
|
|
DelayUs(g_modBusMCtrl[midx].modBusWait); // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽڷ<D6BD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (steps == 4 || steps == -1)
|
|||
|
|
{
|
|||
|
|
g_modBusMCtrl[midx].ModBusCommCleanRsBuf(); // <20><><EFBFBD><EFBFBD><EFBFBD>ѽ<EFBFBD><D1BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
g_modBusMCtrl[midx].CommOutDis(); // <20>رշ<D8B1><D5B7><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (steps != -1)
|
|||
|
|
{
|
|||
|
|
return steps;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>MODBUSЭ<53><D0AD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:
|
|||
|
|
// midx: <09><>վ<EFBFBD><D5BE><EFBFBD><EFBFBD>
|
|||
|
|
// index: <09><><EFBFBD><EFBFBD>Ӧ<EFBFBD>ý<EFBFBD><C3BD>յ<EFBFBD>վ<EFBFBD><D5BE>: 1~247(ʮ<><CAAE><EFBFBD><EFBFBD>)
|
|||
|
|
// cmd: <09><><EFBFBD><EFBFBD>Ӧ<EFBFBD>ý<EFBFBD><C3BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 03H (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
// 06H (д<><D0B4><EFBFBD><EFBFBD>)
|
|||
|
|
// 10H (д<><D0B4><EFBFBD><EFBFBD>)
|
|||
|
|
// addr: <09><><EFBFBD><EFBFBD>Ӧ<EFBFBD>ý<EFBFBD><C3BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ: 0000H~FFFFH
|
|||
|
|
// *pData: <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <09><>λ:<3A><>
|
|||
|
|
// len: <09><><EFBFBD><EFBFBD>Ӧ<EFBFBD>ý<EFBFBD><C3BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>: <09><>λ:<3A><>
|
|||
|
|
// steps: <09><><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ֵ: >0: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ֵΪ<D6B5><CEAA><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
// -1: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -2: <20><><EFBFBD>ճ<EFBFBD>ʱ
|
|||
|
|
// -3: <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
// -4:<3A><><EFBFBD>ڽ<EFBFBD><DABD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
// <20><><EFBFBD>Էֲ<D4B7><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// steps == -1, ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>ʱ
|
|||
|
|
// steps == 1, <20>첽<EFBFBD><ECB2BD><EFBFBD>ñ<EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ȷ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD> len, 0Ϊû<CEAA><C3BB><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
int ModbusRx(int midx, u8 index, u8 cmd, u16 addr, u16 * pData, u16 len, int steps)
|
|||
|
|
{
|
|||
|
|
int i, j, result, exlen, timeout;
|
|||
|
|
u8 pRDat[MDBSRXLEN_MAX]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
u16 checkcrc; // crcУ<63><D0A3>(RTU)
|
|||
|
|
u8 checksum; // <20><>У<EFBFBD><D0A3>(ASCII)
|
|||
|
|
u8 temp_h, temp_l, tempH, tempL; //
|
|||
|
|
|
|||
|
|
if ((cmd != MODBUS_RD) && (cmd != MODBUS_WR) && (cmd != MODBUS_WR_MULTI))
|
|||
|
|
{
|
|||
|
|
return -1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ((len > MODBUS_LENMAX) || (len == 0))
|
|||
|
|
{
|
|||
|
|
return -1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (midx < 0 || midx >= MODBUS_M_NUM)
|
|||
|
|
{
|
|||
|
|
result = -1;
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (g_modBusMCtrl[midx].modBusMode != 0) // ASCII<49><49>ģʽ
|
|||
|
|
{
|
|||
|
|
if (cmd == MODBUS_RD) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
exlen = len * 4 + 11; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else if (cmd == MODBUS_WR) // д<><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
exlen = 17; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else if (cmd == MODBUS_WR_MULTI) // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
exlen = 17; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
exlen = 17; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
exlen -= 1; // <20><>ȥ<EFBFBD><C8A5>ʼ<EFBFBD><CABC> :
|
|||
|
|
}
|
|||
|
|
else // RTU ģʽ
|
|||
|
|
{
|
|||
|
|
if (cmd == MODBUS_RD) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
exlen = len * 2 + 5; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else if (cmd == MODBUS_WR) // д<><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
exlen = 8; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else if (cmd == MODBUS_WR_MULTI) // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
exlen = 8; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
exlen = 8; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (steps == 1 || steps == -1)
|
|||
|
|
{
|
|||
|
|
memset(pRDat, 0, MDBSRXLEN_MAX);
|
|||
|
|
if (g_modBusMCtrl[midx].modBusMode != 0) // ASCII<49><49>ģʽ
|
|||
|
|
{
|
|||
|
|
timeout = exlen*2 + 400; // <20><>ʱʱ<CAB1><CAB1>
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
result = g_modBusMCtrl[midx].ModBusCommReceive(pRDat, 1); // <20>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if (result == 1)
|
|||
|
|
{
|
|||
|
|
if (pRDat[0] == ':') // <20>ҵ<EFBFBD><D2B5><EFBFBD>ʼ<EFBFBD><CABC>־
|
|||
|
|
{
|
|||
|
|
result = 0;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (steps == 1)
|
|||
|
|
{
|
|||
|
|
result = 1; // <20>첽<EFBFBD><ECB2BD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ִ<EFBFBD>в<EFBFBD><D0B2><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (steps == -1)
|
|||
|
|
{
|
|||
|
|
DelayUs(g_modBusMCtrl[midx].modBusWait);
|
|||
|
|
|
|||
|
|
if (timeout-- <= 0)
|
|||
|
|
{
|
|||
|
|
printf("1. call ModbusRx timeout\r\n");
|
|||
|
|
result = -2; //<2F><><EFBFBD>ճ<EFBFBD>ʱ
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}while(1);
|
|||
|
|
|
|||
|
|
if (result != 0)
|
|||
|
|
{
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (steps != -1 && g_modBusMCtrl[midx].modBusMode == 0) // RTU <20><>ģʽ
|
|||
|
|
{
|
|||
|
|
steps = 2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (steps == 2 || steps == -1)
|
|||
|
|
{
|
|||
|
|
timeout = exlen*2 + 400; // <20><>ʱʱ<CAB1><CAB1>
|
|||
|
|
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
result = g_modBusMCtrl[midx].ModBusCommReceive(pRDat, exlen); // <20>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
if (result >= exlen)
|
|||
|
|
{
|
|||
|
|
if (g_modBusMCtrl[midx].modBusMode != 0) // ASCII<49><49>ģʽ
|
|||
|
|
{
|
|||
|
|
if (g_modBusMCtrl[midx].filterChk != 0) // 7λ<37><CEBB><EFBFBD>ݹ<EFBFBD><DDB9><EFBFBD>У<EFBFBD><D0A3>λ
|
|||
|
|
{
|
|||
|
|
for (i = 0; i < result; i++)
|
|||
|
|
{
|
|||
|
|
pRDat[i] &= 0x7F;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
result = 0;
|
|||
|
|
i = 0;
|
|||
|
|
checksum = 0;
|
|||
|
|
|
|||
|
|
if (pRDat[i] != RtuToAscii(HIHFBYTE(index))) // INDEX_H
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_h = AsciiToRtu(pRDat[i++]);
|
|||
|
|
if (pRDat[i] != RtuToAscii(LOHFBYTE(index))) // INDEX_L
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_l = AsciiToRtu(pRDat[i++]);
|
|||
|
|
checksum += MAKEBYTE(temp_l,temp_h);
|
|||
|
|
|
|||
|
|
if (pRDat[i] != RtuToAscii(HIHFBYTE(cmd))) // CMD_H
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
temp_h = AsciiToRtu(pRDat[i++]);
|
|||
|
|
if (pRDat[i] != RtuToAscii(LOHFBYTE(cmd))) // CMD_L
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_l = AsciiToRtu(pRDat[i++]);
|
|||
|
|
checksum += MAKEBYTE(temp_l,temp_h);
|
|||
|
|
|
|||
|
|
if (cmd == MODBUS_RD) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (pRDat[i] != RtuToAscii(HIHFBYTE(LOBYTE(len) << 1))) // LEN_H
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_h = AsciiToRtu(pRDat[i++]);
|
|||
|
|
if (pRDat[i] != RtuToAscii(LOHFBYTE(LOBYTE(len) << 1))) // LEN_L
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_l = AsciiToRtu(pRDat[i++]);
|
|||
|
|
checksum += MAKEBYTE(temp_l,temp_h);
|
|||
|
|
}
|
|||
|
|
else if (cmd == MODBUS_WR) // д<><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (pRDat[i] != RtuToAscii(HIHFBYTE(HIBYTE(addr)))) // ADDR_HH
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_h = AsciiToRtu(pRDat[i++]);
|
|||
|
|
if (pRDat[i] != RtuToAscii(LOHFBYTE(HIBYTE(addr)))) // ADDR_HL
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_l = AsciiToRtu(pRDat[i++]);
|
|||
|
|
checksum += MAKEBYTE(temp_l,temp_h);
|
|||
|
|
|
|||
|
|
if (pRDat[i] != RtuToAscii(HIHFBYTE(LOBYTE(addr)))) // ADDR_LH
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_h = AsciiToRtu(pRDat[i++]);
|
|||
|
|
if (pRDat[i] != RtuToAscii(LOHFBYTE(LOBYTE(addr)))) // ADDR_LL
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_l = AsciiToRtu(pRDat[i++]);
|
|||
|
|
checksum += MAKEBYTE(temp_l,temp_h);
|
|||
|
|
}
|
|||
|
|
else if (cmd == MODBUS_WR_MULTI) // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (pRDat[i] != RtuToAscii(HIHFBYTE(HIBYTE(addr)))) // ADDR_HH
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_h = AsciiToRtu(pRDat[i++]);
|
|||
|
|
if (pRDat[i] != RtuToAscii(LOHFBYTE(HIBYTE(addr)))) // ADDR_HL
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_l = AsciiToRtu(pRDat[i++]);
|
|||
|
|
checksum += MAKEBYTE(temp_l,temp_h);
|
|||
|
|
|
|||
|
|
if (pRDat[i] != RtuToAscii(HIHFBYTE(LOBYTE(addr)))) // ADDR_LH
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_h = AsciiToRtu(pRDat[i++]);
|
|||
|
|
if (pRDat[i] != RtuToAscii(LOHFBYTE(LOBYTE(addr)))) // ADDR_LL
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_l = AsciiToRtu(pRDat[i++]);
|
|||
|
|
checksum += MAKEBYTE(temp_l,temp_h);
|
|||
|
|
|
|||
|
|
if (pRDat[i] != RtuToAscii(HIHFBYTE(HIBYTE(len)))) // LEN_HH
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_h = AsciiToRtu(pRDat[i++]);
|
|||
|
|
if (pRDat[i] != RtuToAscii(LOHFBYTE(HIBYTE(len)))) // LEN_HL
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_l = AsciiToRtu(pRDat[i++]);
|
|||
|
|
checksum += MAKEBYTE(temp_l,temp_h);
|
|||
|
|
|
|||
|
|
if (pRDat[i] != RtuToAscii(HIHFBYTE(LOBYTE(len)))) // LEN_LH
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_h = AsciiToRtu(pRDat[i++]);
|
|||
|
|
if (pRDat[i] != RtuToAscii(LOHFBYTE(LOBYTE(len)))) // LEN_LL
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
temp_l = AsciiToRtu(pRDat[i++]);
|
|||
|
|
checksum += MAKEBYTE(temp_l,temp_h);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (cmd == MODBUS_RD || // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
cmd == MODBUS_WR || // д<><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
0)
|
|||
|
|
{
|
|||
|
|
for (j = 0; j < len; j++)
|
|||
|
|
{
|
|||
|
|
temp_h = AsciiToRtu(pRDat[i++]);
|
|||
|
|
temp_l = AsciiToRtu(pRDat[i++]);
|
|||
|
|
tempH = MAKEBYTE(temp_l, temp_h);
|
|||
|
|
checksum += tempH;
|
|||
|
|
|
|||
|
|
temp_h = AsciiToRtu(pRDat[i++]);
|
|||
|
|
temp_l = AsciiToRtu(pRDat[i++]);
|
|||
|
|
tempL = MAKEBYTE(temp_l, temp_h);
|
|||
|
|
|
|||
|
|
checksum += tempL;
|
|||
|
|
pData[j] = MAKEWORD(tempL, tempH);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
checksum = ~checksum + 1;
|
|||
|
|
|
|||
|
|
if (pRDat[i++] != RtuToAscii(HIHFBYTE(checksum))) // LRC_H
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if (pRDat[i++] != RtuToAscii(LOHFBYTE(checksum))) // LRC_L
|
|||
|
|
{
|
|||
|
|
result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if (pRDat[i++] != '\r') // CR
|
|||
|
|
{
|
|||
|
|
// result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if (pRDat[i++] != '\n') // LF
|
|||
|
|
{
|
|||
|
|
//result = -3; //<2F><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (result == 0)
|
|||
|
|
{
|
|||
|
|
result = len;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else // RTU ģʽ
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
result = 0;
|
|||
|
|
i = 0;
|
|||
|
|
|
|||
|
|
if (pRDat[i++] != index) // <20><>վ<EFBFBD><D5BE>ַ
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (pRDat[i++] != cmd)
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (cmd == MODBUS_RD) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (pRDat[i++] != (LOBYTE(len) << 1)) // LEN
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (cmd == MODBUS_WR) // д<><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (pRDat[i++] != HIBYTE(addr)) // ADDR_H
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (pRDat[i++] != LOBYTE(addr)) // ADDR_L
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (cmd == MODBUS_WR_MULTI) // д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (pRDat[i++] != HIBYTE(addr)) // ADDR_H
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (pRDat[i++] != LOBYTE(addr)) // ADDR_L
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (pRDat[i++] != HIBYTE(len)) // LEN_H
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (pRDat[i++] != LOBYTE(len)) // LEN_L
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (cmd == MODBUS_RD || // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
cmd == MODBUS_WR || // д<><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
0)
|
|||
|
|
{
|
|||
|
|
for (j = 0; j < len; j++)
|
|||
|
|
{
|
|||
|
|
pData[j] = MAKEWORD(pRDat[i+1], pRDat[i]);
|
|||
|
|
i += 2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
checkcrc = ModbusCrc16(&pRDat[0], i);
|
|||
|
|
|
|||
|
|
if (pRDat[i++] != HIBYTE(checkcrc)) // LRC_H
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (pRDat[i++] != LOBYTE(checkcrc)) // LRC_L
|
|||
|
|
{
|
|||
|
|
result = -3; // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (result == 0)
|
|||
|
|
{
|
|||
|
|
result = len;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (result < 0)
|
|||
|
|
{
|
|||
|
|
if (result == -1) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
printf("para error\r\n");
|
|||
|
|
}
|
|||
|
|
else if (result == -2) // <20><><EFBFBD><EFBFBD>û<EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
|
{
|
|||
|
|
printf("usart is not inited\r\n");
|
|||
|
|
}
|
|||
|
|
else if (result == -3) // <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD>
|
|||
|
|
{
|
|||
|
|
printf("usart receive buf ctrl error\r\n");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
result = -4;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else if (result > 0)
|
|||
|
|
{
|
|||
|
|
printf("receive data len error\r\n");
|
|||
|
|
result = -3;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else // result == 0
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (steps == -1)
|
|||
|
|
{
|
|||
|
|
// <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
DelayUs(g_modBusMCtrl[midx].modBusWait);
|
|||
|
|
|
|||
|
|
if (timeout-- <= 0)
|
|||
|
|
{
|
|||
|
|
printf("2. call ModbusRx timeout, index=%d\r\n", index);
|
|||
|
|
result = -2; //<2F><><EFBFBD>ճ<EFBFBD>ʱ
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
result = 0;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}while(1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (result == -3) // <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
{
|
|||
|
|
printf("Rx data error, index=%d\r\n", index);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>MODBUSЭ<53><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ȴ<EFBFBD><C8B4>ذ<EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:
|
|||
|
|
// index: վ<><D5BE>: 1~247(ʮ<><CAAE><EFBFBD><EFBFBD>)
|
|||
|
|
// cmd: <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 03H (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
// 06H (д<><D0B4><EFBFBD><EFBFBD>)
|
|||
|
|
// addr: <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ: 0000H~FFFFH
|
|||
|
|
// pWrDat: д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// wLen: д<>볤<EFBFBD><EBB3A4> <09><>λ:<3A><>
|
|||
|
|
// pRdBuf: <09>ذ<EFBFBD><D8B0><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>:
|
|||
|
|
// rLen: <09><>ȡ(<28>ذ<EFBFBD>)<29><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>: <09><>λ:<3A><>
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ֵ: >=0:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>ذ<DEBB>,<2C><EFBFBD>0;<3B>лذ<D0BB>,<2C><EFBFBD><F2B7B5BB><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>)
|
|||
|
|
// -1: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -2: <20><><EFBFBD>ճ<EFBFBD>ʱ
|
|||
|
|
// -3: <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|||
|
|
|
|||
|
|
int ModbusComm(int midx, u8 index, u8 cmd, u16 addr, u16 * pWrDat, u16 wLen, u16 * pRdBuf, u16 rLen)
|
|||
|
|
{
|
|||
|
|
int result;
|
|||
|
|
u16 rdatabuf[MDBSRXLEN_MAX];
|
|||
|
|
|
|||
|
|
if (cmd != MODBUS_RD) // 20231027
|
|||
|
|
{
|
|||
|
|
if (pWrDat == NULL || wLen == 0)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (cmd == MODBUS_RD)
|
|||
|
|
{
|
|||
|
|
result = ModbusTx(midx, index, cmd, addr, &rLen, 1, -1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
result = ModbusTx(midx, index, cmd, addr, pWrDat, wLen, -1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (result == 0)
|
|||
|
|
{
|
|||
|
|
// <20>ȴ<EFBFBD><C8B4>ذ<EFBFBD>
|
|||
|
|
if (index != 0 &&
|
|||
|
|
((index & 0x80) == 0 || cmd == MODBUS_RD) &&
|
|||
|
|
1)
|
|||
|
|
{
|
|||
|
|
if (pRdBuf == NULL)
|
|||
|
|
{
|
|||
|
|
result = ModbusRx(midx, index, cmd, addr, rdatabuf, rLen, -1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
result = ModbusRx(midx, index, cmd, addr, pRdBuf, rLen, -1);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:16λ<36><CEBB><EFBFBD>ݶ<EFBFBD>д
|
|||
|
|
|
|||
|
|
int ModbusComm16(int midx, u8 index, u8 cmd, u16 addr, u16 wrDat, u16 * pData)
|
|||
|
|
{
|
|||
|
|
int i,rst;
|
|||
|
|
|
|||
|
|
for (i = 0; i < 3; i++)
|
|||
|
|
{
|
|||
|
|
rst = ModbusComm(midx, index, cmd, addr, &wrDat, 1, pData, 1);
|
|||
|
|
DelayMs(1);
|
|||
|
|
if (rst >= 0)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return rst;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:32λ<32><CEBB><EFBFBD>ݶ<EFBFBD>д
|
|||
|
|
int ModbusComm32(int midx, u8 index, u8 cmd, u16 addr, u32 wrDat, u32 * pData)
|
|||
|
|
{
|
|||
|
|
int i,rst;
|
|||
|
|
|
|||
|
|
if (cmd == MODBUS_WR)
|
|||
|
|
{//<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
|
|||
|
|
cmd = MODBUS_WR_MULTI;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (i = 0; i < 3; i++)
|
|||
|
|
{
|
|||
|
|
rst = ModbusComm(midx, index, cmd, addr, (u16*)(&wrDat), 2, (u16*)pData, 2);
|
|||
|
|
DelayMs(1);
|
|||
|
|
if (rst >= 0)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rst;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int ModbusCommMulti(int midx, u8 index, u8 cmd, u16 addr, u16 * pWrDat, u8 wlen, u16 * pRdDat, u8 rlen)
|
|||
|
|
{
|
|||
|
|
int i,rst;
|
|||
|
|
|
|||
|
|
if (cmd == MODBUS_WR)
|
|||
|
|
{//<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
|
|||
|
|
cmd = MODBUS_WR_MULTI;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (i = 0; i < 3; i++)
|
|||
|
|
{
|
|||
|
|
rst = ModbusComm(midx, index, cmd, addr, pWrDat, wlen, pRdDat, rlen);
|
|||
|
|
DelayMs(1);
|
|||
|
|
if (rst >= 0)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rst;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------
|
|||
|
|
|
|||
|
|
Rs485Ctrl g_rs485Ctrl;
|
|||
|
|
|
|||
|
|
void InitRs485Ctrl(int rsvtimout)
|
|||
|
|
{
|
|||
|
|
memset(&g_rs485Ctrl, 0, sizeof(Rs485Ctrl));
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1>ʱʱ<CAB1><CAB1>
|
|||
|
|
if (rsvtimout < 50)
|
|||
|
|
{
|
|||
|
|
g_rs485Ctrl.modrsvTimout = 50;
|
|||
|
|
}
|
|||
|
|
else if (rsvtimout > 500)
|
|||
|
|
{
|
|||
|
|
g_rs485Ctrl.modrsvTimout = 500;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
g_rs485Ctrl.modrsvTimout = rsvtimout;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void RegRsCmdProc(Resv485ExProc proc)
|
|||
|
|
{
|
|||
|
|
g_rs485Ctrl.resv485exproc = proc;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int AddRs485Cmd(Rs485Cmd * pCmd)
|
|||
|
|
{
|
|||
|
|
Rs485Ctrl * p485Ctrl = &g_rs485Ctrl;
|
|||
|
|
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int GetRs485CmdBufLen(void)
|
|||
|
|
{
|
|||
|
|
return g_rs485Ctrl.bufCmdNum;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int Rs485Task(void)
|
|||
|
|
{
|
|||
|
|
// <20>ֲ<EFBFBD><D6B2><EFBFBD>ִ<EFBFBD><D6B4>
|
|||
|
|
int rslt;
|
|||
|
|
u32 curIime;
|
|||
|
|
|
|||
|
|
Rs485Cmd *pCmd;
|
|||
|
|
|
|||
|
|
Rs485Ctrl * p485Ctrl = &g_rs485Ctrl;
|
|||
|
|
|
|||
|
|
if (p485Ctrl == NULL)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pCmd = &(p485Ctrl->cmdbuf[p485Ctrl->bufHead]);
|
|||
|
|
|
|||
|
|
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
|
|||
|
|
curIime = GetUsSoftTimer();
|
|||
|
|
|
|||
|
|
if ((curIime - p485Ctrl->stepTime) > g_modBusMCtrl[pCmd->midx].modBusWait)
|
|||
|
|
{
|
|||
|
|
p485Ctrl->stepTime = curIime;
|
|||
|
|
|
|||
|
|
if (p485Ctrl->working == 0 &&
|
|||
|
|
p485Ctrl->bufCmdNum > 0 &&
|
|||
|
|
p485Ctrl->steps == 0)
|
|||
|
|
{
|
|||
|
|
p485Ctrl->working = 1;
|
|||
|
|
p485Ctrl->steps = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (p485Ctrl->working == 0)
|
|||
|
|
{
|
|||
|
|
p485Ctrl->steps = 0;
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (p485Ctrl->steps > 0 && p485Ctrl->steps < 5)
|
|||
|
|
{
|
|||
|
|
if (pCmd->cmd == MODBUS_RD)
|
|||
|
|
{
|
|||
|
|
rslt = ModbusTx(pCmd->midx, pCmd->index, pCmd->cmd, pCmd->addr, &(pCmd->rlen), 1, p485Ctrl->steps);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
rslt = ModbusTx(pCmd->midx, pCmd->index, pCmd->cmd, pCmd->addr, pCmd->wrdat, pCmd->wlen, p485Ctrl->steps);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rslt == p485Ctrl->steps)
|
|||
|
|
{
|
|||
|
|
p485Ctrl->steps++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (p485Ctrl->steps >= 5 && p485Ctrl->steps < p485Ctrl->modrsvTimout)
|
|||
|
|
{
|
|||
|
|
// <20>ȴ<EFBFBD><C8B4>ذ<EFBFBD>
|
|||
|
|
if (pCmd->index != 0 &&
|
|||
|
|
((pCmd->index & 0x80) == 0 || pCmd->cmd == MODBUS_RD) &&
|
|||
|
|
1)
|
|||
|
|
{
|
|||
|
|
if (pCmd->cmd == MODBUS_RD)
|
|||
|
|
{
|
|||
|
|
rslt = ModbusRx(pCmd->midx, pCmd->index, pCmd->cmd, pCmd->addr, pCmd->rddat, pCmd->rlen, 1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
rslt = ModbusRx(pCmd->midx, pCmd->index, pCmd->cmd, pCmd->addr, pCmd->rddat, 1, 1);
|
|||
|
|
}
|
|||
|
|
if (rslt == pCmd->rlen) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
// ִ<>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD>
|
|||
|
|
if (p485Ctrl->resv485exproc != NULL)
|
|||
|
|
{
|
|||
|
|
p485Ctrl->resv485exproc(pCmd);
|
|||
|
|
}
|
|||
|
|
p485Ctrl->steps = p485Ctrl->modrsvTimout;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
p485Ctrl->steps++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
p485Ctrl->steps = p485Ctrl->modrsvTimout;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
p485Ctrl->steps++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (p485Ctrl->steps >= p485Ctrl->modrsvTimout)
|
|||
|
|
{
|
|||
|
|
if (p485Ctrl->bufCmdNum > 0)
|
|||
|
|
{
|
|||
|
|
p485Ctrl->bufCmdNum--;
|
|||
|
|
}
|
|||
|
|
p485Ctrl->steps = 0;
|
|||
|
|
p485Ctrl->working = 0;
|
|||
|
|
p485Ctrl->bufHead++;
|
|||
|
|
if (p485Ctrl->bufHead >= MAX_485CMD)
|
|||
|
|
{
|
|||
|
|
p485Ctrl->bufHead = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return p485Ctrl->steps;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-----------------------------------------------------------------
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|