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- /*********************************************************************************/
999971tU8 AvrModbusMasterLinkUserException (tag_AvrModbusMasterCtrl * Master , void (* UserException )(tU8 Id ))
1000972{
1001973 /*
0 commit comments