Skip to content

Commit 16990b3

Browse files
Merge pull request #21 from TimerOverflow/20200703
20200703
2 parents 4980f43 + e3bef01 commit 16990b3

File tree

2 files changed

+34
-58
lines changed

2 files changed

+34
-58
lines changed

AvrModbus.c

Lines changed: 15 additions & 43 deletions
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 != 20200623)
12+
#if(AVR_MODBUS_REVISION_DATE != 20200703)
1313
#error wrong include file. (AvrModbus.h)
1414
#endif
1515
/*********************************************************************************/
@@ -251,7 +251,8 @@ static void SlaveReadSerialNumber(tag_AvrModbusSlaveCtrl *Slave)
251251
tU8 *BaseAddr;
252252

253253
StartAddr = (tU16) (RxQue->Buf[2] << 8) + RxQue->Buf[3];
254-
NumberOfPoint = (tU16) (RxQue->Buf[4] << 8) + RxQue->Buf[5];
254+
NumberOfPoint = strlen(Slave->SerialNumberAddr) / 2;
255+
if(strlen(Slave->SerialNumberAddr) % 2) NumberOfPoint += 1;
255256

256257
if(Slave->Bit.InitSerialNumber == false)
257258
{
@@ -264,7 +265,7 @@ static void SlaveReadSerialNumber(tag_AvrModbusSlaveCtrl *Slave)
264265
else
265266
{
266267
NumberOfPoint *= 2;
267-
BaseAddr = Slave->SerialNumberAddr;
268+
BaseAddr = (tU8 *) Slave->SerialNumberAddr;
268269

269270
AvrUartPutChar(Slave->Uart, RxQue->Buf[0]); //Slave Address
270271
AvrUartPutChar(Slave->Uart, RxQue->Buf[1]); //Function
@@ -435,7 +436,7 @@ tU8 AvrModbusSlaveLinkCustomFrameCheck(tag_AvrModbusSlaveCtrl *Slave, tU16 (*Cus
435436
/*
436437
1) 인수
437438
- Slave : tag_AvrModbusSlaveCtrl 인스턴스의 주소.
438-
- CustomFrameCheck : 사영자 정의 프레임 에러 검출 함수 주소.
439+
- CustomFrameCheck : 사용자 정의 프레임 에러 검출 함수 주소.
439440
440441
2) 반환
441442
- 0 : 초기화 실패
@@ -456,19 +457,19 @@ tU8 AvrModbusSlaveLinkCustomFrameCheck(tag_AvrModbusSlaveCtrl *Slave, tU16 (*Cus
456457
return Slave->Bit.InitCustomFrameCheck;
457458
}
458459
/*********************************************************************************/
459-
tU8 AvrModbusSlaveLinkSerialNumber(tag_AvrModbusSlaveCtrl *Slave, tU8 *SerialNumberAddr)
460+
tU8 AvrModbusSlaveLinkSerialNumber(tag_AvrModbusSlaveCtrl *Slave, char *SerialNumberAddr)
460461
{
461462
/*
462463
1) 인수
463464
- Slave : tag_AvrModbusSlaveCtrl 인스턴스의 주소.
464-
- CustomFrameCheck : 사영자 정의 프레임 에러 검출 함수 주소.
465+
- SerialNumberAddr : 프로그램명 문자열.
465466
466467
2) 반환
467468
- 0 : 초기화 실패
468469
- 1 : 초기화 성공
469470
470471
3) 설명
471-
- 사용자 정의 프레임 에러 검출 함수 연결.
472+
- 본 함수를 호출하여 문자열 연결 후 AVR_MODBUS_ReadSerialNumber(0x73)으로 호출하면 프로그램명 응답.
472473
*/
473474

474475
if(Slave->Bit.InitComplete == false)
@@ -655,7 +656,7 @@ static void MasterPolling(tag_AvrModbusMasterCtrl *Master)
655656
PollData = &Master->SlavePoll->PollData[Master->SlavePoll->PollDataIndex];
656657

657658
AvrUartPutChar(Master->Uart, Master->SlavePoll->Id);
658-
AvrUartPutChar(Master->Uart, Master->SlavePoll->PollFunction);
659+
AvrUartPutChar(Master->Uart, PollData->PollFunction);
659660
AvrUartPutChar(Master->Uart, (PollData->StartAddr >> 8));
660661
AvrUartPutChar(Master->Uart, (PollData->StartAddr & 0x00FF));
661662
AvrUartPutChar(Master->Uart, (PollData->NumberOfRegister >> 8));
@@ -687,15 +688,15 @@ static void MasterReceive(tag_AvrModbusMasterCtrl *Master)
687688
*/
688689

689690
Slave = AvrModbusMasterFindSlaveById(Master, RxQue->Buf[0]);
691+
PollData = &Slave->PollData[Slave->PollDataIndex];
690692

691-
if((Slave != null) && (RxQue->Buf[1] == Slave->PollFunction))
693+
if((Slave != null) && (RxQue->Buf[1] == PollData->PollFunction))
692694
{
693695
Crc16 = Crc16Check(RxQue->OutPtr, RxQue->Buf, &RxQue->Buf[RxQue->Size - 1], RxQue->Ctr - 2);
694696

695697
if((RxQue->Buf[RxQue->Ctr - 2] == (Crc16 >> 8)) && (RxQue->Buf[RxQue->Ctr - 1] == (Crc16 & 0x00FF)))
696698
{
697699
Slave->NoResponseCnt = 0;
698-
PollData = &Slave->PollData[Slave->PollDataIndex];
699700
Length = PollData->NumberOfRegister * 2;
700701
for(i = 0; i < Length; i += 2)
701702
{
@@ -772,7 +773,7 @@ tU8 AvrModbusMasterSetPollingDelay(tag_AvrModbusMasterCtrl *Master, tU32 PollDel
772773
return true;
773774
}
774775
/*********************************************************************************/
775-
tU8 AvrModbusMasterAddSlave(tag_AvrModbusMasterCtrl *Master, tU8 Id, tU16 StartAddr, tU16 NumberOfRegister, tU8 *BaseAddr)
776+
tU8 AvrModbusMasterAddSlave(tag_AvrModbusMasterCtrl *Master, tU8 Id, enum_AvrModbusFunction PollFunction, tU16 StartAddr, tU16 NumberOfRegister, tU8 *BaseAddr)
776777
{
777778
tU8 i;
778779
tag_AvrModbusMasterSlaveInfo *Slave = Master->SlaveArray;
@@ -823,7 +824,7 @@ tU8 AvrModbusMasterAddSlave(tag_AvrModbusMasterCtrl *Master, tU8 Id, tU16 StartA
823824
Master->SlaveArray[i].NoResponseCnt = 0;
824825
Master->SlaveArray[i].NoResponseLimit = AVR_MODBUS_DEFAULT_SLAVE_NO_RESPONSE;
825826
Master->SlaveArray[i].PollDataMax = 1;
826-
Master->SlaveArray[i].PollFunction = AVR_MODBUS_ReadHolding;
827+
Master->SlaveArray[i].PollData[0].PollFunction = AVR_MODBUS_ReadHolding;
827828
Master->SlaveArray[i].PollData[0].StartAddr = StartAddr;
828829
Master->SlaveArray[i].PollData[0].NumberOfRegister = NumberOfRegister;
829830
Master->SlaveArray[i].PollData[0].BaseAddr = BaseAddr;
@@ -838,7 +839,7 @@ tU8 AvrModbusMasterAddSlave(tag_AvrModbusMasterCtrl *Master, tU8 Id, tU16 StartA
838839
return false;
839840
}
840841
/*********************************************************************************/
841-
tU8 AvrModbusMasterAddSlavePollData(tag_AvrModbusMasterCtrl *Master, tU8 Id, tU16 StartAddr, tU16 NumberOfRegister, tU8 *BaseAddr)
842+
tU8 AvrModbusMasterAddSlavePollData(tag_AvrModbusMasterCtrl *Master, tU8 Id, enum_AvrModbusFunction PollFunction, tU16 StartAddr, tU16 NumberOfRegister, tU8 *BaseAddr)
842843
{
843844
tU8 i;
844845
tag_AvrModbusMasterSlaveInfo *Slave = Master->SlaveArray;
@@ -900,6 +901,7 @@ tU8 AvrModbusMasterAddSlavePollData(tag_AvrModbusMasterCtrl *Master, tU8 Id, tU1
900901
Slave->PollData[Slave->PollDataMax - 1].StartAddr = StartAddr;
901902
Slave->PollData[Slave->PollDataMax - 1].NumberOfRegister = NumberOfRegister;
902903
Slave->PollData[Slave->PollDataMax - 1].BaseAddr = BaseAddr;
904+
Slave->PollData[Slave->PollDataMax - 1].PollFunction = PollFunction;
903905

904906
return true;
905907
}
@@ -966,36 +968,6 @@ void AvrModbusMasterSetSlaveNoResponse(tag_AvrModbusMasterCtrl *Master, tU8 Id,
966968
}
967969
}
968970
/*********************************************************************************/
969-
void AvrModbusMasterSetSlavePollFunction(tag_AvrModbusMasterCtrl *Master, tU8 Id, enum_AvrModbusFunction PollFunction)
970-
{
971-
tag_AvrModbusMasterSlaveInfo *Slave = null;
972-
973-
/*
974-
1) 인수
975-
- Master : tag_AvrModbusMasterCtrl 인스턴스의 주소.
976-
- Id : Slave의 ID.
977-
- PollFunction : 호출 펑션.
978-
979-
2) 반환
980-
- 없음.
981-
982-
3) 설명
983-
- 슬레이브 호출 펑션 변경.
984-
*/
985-
986-
if((Master->Bit.InitComplete == false) || (Master->AddedSlave == 0) || ((PollFunction != AVR_MODBUS_ReadHolding) && (PollFunction != AVR_MODBUS_ReadInput)))
987-
{
988-
return;
989-
}
990-
991-
Slave = AvrModbusMasterFindSlaveById(Master, Id);
992-
993-
if(Slave != null)
994-
{
995-
Slave->PollFunction = PollFunction;
996-
}
997-
}
998-
/*********************************************************************************/
999971
tU8 AvrModbusMasterLinkUserException(tag_AvrModbusMasterCtrl *Master, void (*UserException)(tU8 Id))
1000972
{
1001973
/*

AvrModbus.h

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,15 @@
99
/*********************************************************************************/
1010
#include "AvrUart.h"
1111
/*********************************************************************************/
12-
#define AVR_MODBUS_REVISION_DATE 20200623
12+
#define AVR_MODBUS_REVISION_DATE 20200703
1313
/*********************************************************************************/
1414
/** REVISION HISTORY **/
1515
/*
16+
2020. 07. 03. - Slave파트 AVR_MODBUS_ReadSerialNumber (0x73)펑션 마스터가 요청하는 길이 부분은 무시하고,
17+
Jeong Hyun Gu 연결 되어 있는 프로그램명 문자열 길이로 응답.
18+
- Master파트 AvrModbusMasterSetSlavePollFunction() 삭제. 앞으로 PollFunction은 AvrModbusMasterAddSlave(),
19+
AvrModbusMasterAddSlavePollData()를 호출할 때 결정하도록 변경.
20+
1621
2020. 06. 23. - Slave파트 AVR_MODBUS_ReadSerialNumber (0x73) 펑션 추가.
1722
Jeong Hyun Gu
1823
@@ -111,7 +116,7 @@
111116
#define false 0
112117
#define null 0
113118

114-
#define AVR_MODBUS_MASTER false
119+
#define AVR_MODBUS_MASTER true
115120
#define AVR_MODBUS_SLAVE true
116121

117122
#define AVR_MODBUS_RECEIVING_DELAY_US 20000
@@ -140,9 +145,9 @@ typedef struct tag_AvrModbusSlaveCtrl
140145
{
141146
struct
142147
{
143-
tU8 InitGeneral : 1;
144-
tU8 InitCheckOutRange : 1;
145-
tU8 InitUserException : 1;
148+
tU8 InitGeneral : 1;
149+
tU8 InitCheckOutRange : 1;
150+
tU8 InitUserException : 1;
146151
tU8 InitPreUserException : 1;
147152
tU8 InitCustomFrameCheck : 1;
148153
tU8 InitSerialNumber : 1;
@@ -156,7 +161,7 @@ typedef struct tag_AvrModbusSlaveCtrl
156161
tU16 (*CustomFrameCheck)(tag_AvrUartRingBuf *Que, tU16 Ctr);
157162

158163
tU8 *BaseAddr;
159-
tU8 *SerialNumberAddr;
164+
char *SerialNumberAddr;
160165
tU16 MapStartAddr;
161166
}tag_AvrModbusSlaveCtrl;
162167

@@ -169,6 +174,7 @@ typedef struct
169174
tU16 StartAddr;
170175
tU16 NumberOfRegister;
171176
tU8 *BaseAddr;
177+
enum_AvrModbusFunction PollFunction;
172178
}tag_AvrModbusMasterSlavePollData;
173179

174180
typedef struct
@@ -178,18 +184,17 @@ typedef struct
178184
tU8 NoResponseLimit;
179185
tU8 PollDataIndex;
180186
tU8 PollDataMax;
181-
enum_AvrModbusFunction PollFunction;
182187
tag_AvrModbusMasterSlavePollData *PollData;
183188
}tag_AvrModbusMasterSlaveInfo;
184189

185190
typedef struct
186191
{
187192
struct
188193
{
189-
tU8 InitGeneral : 1;
190-
tU8 InitRxUserException: 1;
191-
tU8 InitComplete : 1;
192-
tU8 PollDataAllocFail : 1;
194+
tU8 InitGeneral : 1;
195+
tU8 InitRxUserException : 1;
196+
tU8 InitComplete : 1;
197+
tU8 PollDataAllocFail : 1;
193198
}Bit;
194199

195200
tag_AvrUartCtrl *Uart;
@@ -222,7 +227,7 @@ tU8 AvrModbusSlaveLinkUserExceptionFunc(tag_AvrModbusSlaveCtrl *Slave, void (*Us
222227
tU8 AvrModbusSlaveLinkPreUserExceptionFunc(tag_AvrModbusSlaveCtrl *Slave, tU8 (*PreUserException)(tag_AvrModbusSlaveCtrl *Slave, tU8 *SlaveId));
223228
tU8 AvrModbusSlaveSetMapStartAddr(tag_AvrModbusSlaveCtrl *Slave, tU16 MapStartAddr);
224229
tU8 AvrModbusSlaveLinkCustomFrameCheck(tag_AvrModbusSlaveCtrl *Slave, tU16 (*CustomFrameCheck)(tag_AvrUartRingBuf *Que, tU16 Ctr));
225-
tU8 AvrModbusSlaveLinkSerialNumber(tag_AvrModbusSlaveCtrl *Slave, tU8 *SerialNumberAddr);
230+
tU8 AvrModbusSlaveLinkSerialNumber(tag_AvrModbusSlaveCtrl *Slave, char *SerialNumberAddr);
226231
void AvrModbusSlaveProc(tag_AvrModbusSlaveCtrl *Slave, tU8 SlaveId);
227232

228233
#endif
@@ -232,11 +237,10 @@ void AvrModbusSlaveProc(tag_AvrModbusSlaveCtrl *Slave, tU8 SlaveId);
232237

233238
tU8 AvrModbusMasterGeneralInit(tag_AvrModbusMasterCtrl *Master, tag_AvrUartCtrl *Uart, tU8 MaxSlave, tU32 MasterProcTick_us);
234239
tU8 AvrModbusMasterSetPollingDelay(tag_AvrModbusMasterCtrl *Master, tU32 PollDelay_us);
235-
tU8 AvrModbusMasterAddSlave(tag_AvrModbusMasterCtrl *Master, tU8 Id, tU16 StartAddr, tU16 NumberOfRegister, tU8 *BaseAddr);
236-
tU8 AvrModbusMasterAddSlavePollData(tag_AvrModbusMasterCtrl *Master, tU8 Id, tU16 StartAddr, tU16 NumberOfRegister, tU8 *BaseAddr);
240+
tU8 AvrModbusMasterAddSlave(tag_AvrModbusMasterCtrl *Master, tU8 Id, enum_AvrModbusFunction PollFunction, tU16 StartAddr, tU16 NumberOfRegister, tU8 *BaseAddr);
241+
tU8 AvrModbusMasterAddSlavePollData(tag_AvrModbusMasterCtrl *Master, tU8 Id, enum_AvrModbusFunction PollFunction, tU16 StartAddr, tU16 NumberOfRegister, tU8 *BaseAddr);
237242
void AvrModbusMasterRemoveSlave(tag_AvrModbusMasterCtrl *Master, tU8 Id);
238243
void AvrModbusMasterSetSlaveNoResponse(tag_AvrModbusMasterCtrl *Master, tU8 Id, tU8 NoResponseLimit);
239-
void AvrModbusMasterSetSlavePollFunction(tag_AvrModbusMasterCtrl *Master, tU8 Id, enum_AvrModbusFunction PollFunction);
240244
tU8 AvrModbusMasterLinkUserException(tag_AvrModbusMasterCtrl *Master, void (*UserException)(tU8 Id));
241245

242246
void AvrModbusMasterProc(tag_AvrModbusMasterCtrl *Master);

0 commit comments

Comments
 (0)