Skip to content

Commit 4980f43

Browse files
Merge pull request #20 from TimerOverflow/20200623
20200623
2 parents 214a467 + c11b180 commit 4980f43

File tree

2 files changed

+79
-2
lines changed

2 files changed

+79
-2
lines changed

AvrModbus.c

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include "AvrModbus.h"
1010
#include "crc16.h"
1111
/*********************************************************************************/
12-
#if(AVR_MODBUS_REVISION_DATE != 20191010)
12+
#if(AVR_MODBUS_REVISION_DATE != 20200623)
1313
#error wrong include file. (AvrModbus.h)
1414
#endif
1515
/*********************************************************************************/
@@ -243,6 +243,46 @@ static void SlavePresetMultiple(tag_AvrModbusSlaveCtrl *Slave)
243243
}
244244
}
245245
/*********************************************************************************/
246+
static void SlaveReadSerialNumber(tag_AvrModbusSlaveCtrl *Slave)
247+
{
248+
tag_AvrUartRingBuf *TxQue = &Slave->Uart->TxQueue;
249+
tag_AvrUartRingBuf *RxQue = &Slave->Uart->RxQueue;
250+
tU16 StartAddr, NumberOfPoint, Crc16, i;
251+
tU8 *BaseAddr;
252+
253+
StartAddr = (tU16) (RxQue->Buf[2] << 8) + RxQue->Buf[3];
254+
NumberOfPoint = (tU16) (RxQue->Buf[4] << 8) + RxQue->Buf[5];
255+
256+
if(Slave->Bit.InitSerialNumber == false)
257+
{
258+
ErrorException(Slave, 0x0E);
259+
}
260+
else if(StartAddr != 0x0F0C)
261+
{
262+
ErrorException(Slave, 0x0F);
263+
}
264+
else
265+
{
266+
NumberOfPoint *= 2;
267+
BaseAddr = Slave->SerialNumberAddr;
268+
269+
AvrUartPutChar(Slave->Uart, RxQue->Buf[0]); //Slave Address
270+
AvrUartPutChar(Slave->Uart, RxQue->Buf[1]); //Function
271+
AvrUartPutChar(Slave->Uart, NumberOfPoint); //Byte Count
272+
273+
for(i = 0; i < NumberOfPoint; i++)
274+
{
275+
AvrUartPutChar(Slave->Uart, *(BaseAddr + i));
276+
}
277+
278+
Crc16 = Crc16Check(TxQue->OutPtr, TxQue->Buf, &TxQue->Buf[TxQue->Size - 1], TxQue->Ctr);
279+
280+
AvrUartPutChar(Slave->Uart, (Crc16 >> 8));
281+
AvrUartPutChar(Slave->Uart, (Crc16 & 0x00FF));
282+
AvrUartStartTx(Slave->Uart);
283+
}
284+
}
285+
/*********************************************************************************/
246286
tU8 AvrModbusSlaveGeneralInit(tag_AvrModbusSlaveCtrl *Slave, tag_AvrUartCtrl *Uart, tU8 *BaseAddr, tU32 SlaveProcTick_us)
247287
{
248288
/*
@@ -416,6 +456,32 @@ tU8 AvrModbusSlaveLinkCustomFrameCheck(tag_AvrModbusSlaveCtrl *Slave, tU16 (*Cus
416456
return Slave->Bit.InitCustomFrameCheck;
417457
}
418458
/*********************************************************************************/
459+
tU8 AvrModbusSlaveLinkSerialNumber(tag_AvrModbusSlaveCtrl *Slave, tU8 *SerialNumberAddr)
460+
{
461+
/*
462+
1) 인수
463+
- Slave : tag_AvrModbusSlaveCtrl 인스턴스의 주소.
464+
- CustomFrameCheck : 사영자 정의 프레임 에러 검출 함수 주소.
465+
466+
2) 반환
467+
- 0 : 초기화 실패
468+
- 1 : 초기화 성공
469+
470+
3) 설명
471+
- 사용자 정의 프레임 에러 검출 함수 연결.
472+
*/
473+
474+
if(Slave->Bit.InitComplete == false)
475+
{
476+
return false;
477+
}
478+
479+
Slave->SerialNumberAddr = SerialNumberAddr;
480+
Slave->Bit.InitSerialNumber = true;
481+
482+
return Slave->Bit.InitSerialNumber;
483+
}
484+
/*********************************************************************************/
419485
void AvrModbusSlaveProc(tag_AvrModbusSlaveCtrl *Slave, tU8 SlaveId)
420486
{
421487
tag_AvrUartRingBuf *RxQue = &Slave->Uart->RxQueue;
@@ -474,6 +540,10 @@ void AvrModbusSlaveProc(tag_AvrModbusSlaveCtrl *Slave, tU8 SlaveId)
474540
case AVR_MODBUS_PresetMultiple :
475541
SlavePresetMultiple(Slave);
476542
break;
543+
544+
case AVR_MODBUS_ReadSerialNumber :
545+
SlaveReadSerialNumber(Slave);
546+
break;
477547

478548
default :
479549
ErrorException(Slave, 1);

AvrModbus.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
/*********************************************************************************/
1010
#include "AvrUart.h"
1111
/*********************************************************************************/
12-
#define AVR_MODBUS_REVISION_DATE 20191010
12+
#define AVR_MODBUS_REVISION_DATE 20200623
1313
/*********************************************************************************/
1414
/** REVISION HISTORY **/
1515
/*
16+
2020. 06. 23. - Slave파트 AVR_MODBUS_ReadSerialNumber (0x73) 펑션 추가.
17+
Jeong Hyun Gu
18+
1619
2019. 10. 10. - crc16(20191007) 버전 대응 위해 SysTypedef.h 적용.
1720
Jeong Hyun Gu - AvrUart(20191010) 버전 대응 위해 AvrModbusSlaveProc()에서
1821
AvrUartFixTxEnableFloating() 삭제, AvrUartControlTxEnd() 호출.
@@ -121,6 +124,7 @@
121124

122125
typedef enum
123126
{
127+
AVR_MODBUS_ReadSerialNumber = 0x73,
124128
AVR_MODBUS_ReadHolding = 0x03,
125129
AVR_MODBUS_ReadInput = 0x04,
126130
AVR_MODBUS_PresetSingle = 0x06,
@@ -141,6 +145,7 @@ typedef struct tag_AvrModbusSlaveCtrl
141145
tU8 InitUserException : 1;
142146
tU8 InitPreUserException : 1;
143147
tU8 InitCustomFrameCheck : 1;
148+
tU8 InitSerialNumber : 1;
144149
tU8 InitComplete : 1;
145150
}Bit;
146151

@@ -151,6 +156,7 @@ typedef struct tag_AvrModbusSlaveCtrl
151156
tU16 (*CustomFrameCheck)(tag_AvrUartRingBuf *Que, tU16 Ctr);
152157

153158
tU8 *BaseAddr;
159+
tU8 *SerialNumberAddr;
154160
tU16 MapStartAddr;
155161
}tag_AvrModbusSlaveCtrl;
156162

@@ -216,6 +222,7 @@ tU8 AvrModbusSlaveLinkUserExceptionFunc(tag_AvrModbusSlaveCtrl *Slave, void (*Us
216222
tU8 AvrModbusSlaveLinkPreUserExceptionFunc(tag_AvrModbusSlaveCtrl *Slave, tU8 (*PreUserException)(tag_AvrModbusSlaveCtrl *Slave, tU8 *SlaveId));
217223
tU8 AvrModbusSlaveSetMapStartAddr(tag_AvrModbusSlaveCtrl *Slave, tU16 MapStartAddr);
218224
tU8 AvrModbusSlaveLinkCustomFrameCheck(tag_AvrModbusSlaveCtrl *Slave, tU16 (*CustomFrameCheck)(tag_AvrUartRingBuf *Que, tU16 Ctr));
225+
tU8 AvrModbusSlaveLinkSerialNumber(tag_AvrModbusSlaveCtrl *Slave, tU8 *SerialNumberAddr);
219226
void AvrModbusSlaveProc(tag_AvrModbusSlaveCtrl *Slave, tU8 SlaveId);
220227

221228
#endif

0 commit comments

Comments
 (0)