Date: Fri, 29 Mar 2024 15:10:10 +0000 (UTC) Message-ID: <860735606.137.1711725010977@6bf000190eb4> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_136_830664078.1711725010977" ------=_Part_136_830664078.1711725010977 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
The BACnet server from the FAQ BACnet: Cyclic Reading= of a Property is used as the server here.
Adapt the "PLC_PRG" as follows:
=
Declaration
VAR =09xAddCalendar=09=09: BOOL; =09// API does not check dayOfweek!!! =3D=3D >> DAY_OF_WEEK_UNSPECIFI= ED =09bacDate=09=09=09=09: CmpBACnet.IEC_BACNET_DATE :=3D (year :=3D 2020, mon= th :=3D 2, dayOfMonth :=3D 7, dayOfWeek :=3D CmpBACnet.IEC_BACNET_DAY_OF_WE= EK.DAY_OF_WEEK_FRIDAY); =09bacDate2=09=09=09: CmpBACnet.IEC_BACNET_DATE :=3D (year :=3D 2020, month= :=3D 2, dayOfMonth :=3D 14, dayOfWeek :=3D CmpBACnet.IEC_BACNET_DAY_OF_WEE= K.DAY_OF_WEEK_UNSPECIFIED); =09bacDateStartRange=09: CmpBACnet.IEC_BACNET_DATE :=3D (year :=3D 2020, mo= nth :=3D 2, dayOfMonth :=3D 17, dayOfWeek :=3D CmpBACnet.IEC_BACNET_DAY_OF_= WEEK.DAY_OF_WEEK_UNSPECIFIED); =09bacDateEndRange=09=09: CmpBACnet.IEC_BACNET_DATE :=3D (year :=3D 2020, m= onth :=3D 3, dayOfMonth :=3D 25, dayOfWeek :=3D CmpBACnet.IEC_BACNET_DAY_OF= _WEEK.DAY_OF_WEEK_UNSPECIFIED); =09 =09udiCnt=09=09=09=09: UDINT; =09xMatchCurDay=09=09: BOOL; END_VAR
Implementation
BACnet_= Calendar.GetEntryCount(count =3D> udiCnt); xMatchCurDay :=3D BACnet_Calendar.PresentValue; IF xAddCalendar THEN =09xAddCalendar :=3D FALSE; =09BACnet_Calendar.AddBACnetDate(bacDat :=3D bacDate); =09BACnet_Calendar.AddBACnetDate(bacDat :=3D bacDate2); =09BACnet_Calendar.AddBACnetDateRange(bacStartDat :=3D bacDateStartRange, b= acEndDat :=3D bacDateEndRange); END_IF
Adapt the "PLC_PRG" as follows:
=
Declaration
VAR CON= STANT =09c_udiMaxEntries=09=09: UDINT :=3D 10; =09c_sDelimeter=09=09: String :=3D '.'; END_VAR VAR =09fbReadProperty=09=09: BACnet.BACnetClientReadProperty; =09xReadExecute=09=09: BOOL; =09 =09xInitDone =09=09=09: BOOL :=3D FALSE; =09bacCalendarContents=09: CmpBACnet.IEC_BACNET_PROPERTY_CONTENTS; =09udiIndex=09=09=09: UDINT; =09 =09asEntries=09=09=09: ARRAY [0..c_udiMaxEntries] OF STRING; =09 =09pbyRawBuffer=09=09: POINTER TO BYTE; =09pCalenderEntry=09=09: POINTER TO CmpBACnet.IEC_BACNET_CALENDAR_ENTRY; =09dat : CmpBACnet.IEC_BACNET_DATE; =09// Value is used if type is set to "date range" =09dateRange : CmpBACnet.IEC_BACNET_DATE_RANGE; =09// Value is used if type is set to "week-n-day" =09weekNDay : CmpBACnet.IEC_BACNET_WEEK_AND_DAY; =09sHelp=09=09=09=09: STRING; END_VAR
Implementation
IF NOT = xInitDone THEN =09fbReadProperty.RegisterToServer(BACnet_Client); =09fbReadProperty(dwTargetDeviceNumber :=3D 718, =09=09=09=09objType :=3D BACnet.CmpBACnet.IEC_BACNET_OBJECT_TYPE.OBJ_CA= LENDAR, objInst :=3D 1, =09=09=09=09propID :=3D BACnet.CmpBACnet.IEC_BACNET_PROPERTY_ID.PROP_DA= TELIST, =09=09=09=09=09udiTimeOut :=3D 5000000); =09xInitDone :=3D TRUE; ELSE =09fbReadProperty(xExecute :=3D xReadExecute); =09IF fbReadProperty.xDone THEN =09=09xReadExecute :=3D FALSE; =09=09bacCalendarContents :=3D fbReadProperty.result; =09=09IF bacCalendarContents.tag =3D CmpBACnet.IEC_BACNET_DATA_TYPE.DATA_TY= PE_CALENDAR_ENTRY THEN=09 =09=09=09pCalenderEntry :=3D bacCalendarContents.buffer.pBuffer; =09=09=09FOR udiIndex :=3D 0 TO bacCalendarContents.nElements -1 DO =09=09=09=09CASE pCalenderEntry[udiIndex].tag OF =09=09=09=09=09CmpBACnet.IEC_BACNET_CALENDAR_ENTRY_TYPE.CALENDAR_ENTRY_DATE= : =09=09=09=09=09=09sHelp :=3D CONCAT(BYTE_TO_STRING(pCalenderEntry[udiIndex]= .entry.dat.dayOfMonth), '.'); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, TO_STRING(pCalenderEntry[udiInde= x].entry.dat.month)); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, '.'); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, WORD_TO_STRING(pCalenderEntry[ud= iIndex].entry.dat.year)); =09=09=09=09=09=09asEntries[udiIndex] :=3D sHelp;=20 =09=09=09=09=09=09CmpBACnet.IEC_BACNET_CALENDAR_ENTRY_TYPE.CALENDAR_ENTRY_D= ATE_RANGE: =09=09=09=09=09=09sHelp :=3D CONCAT(BYTE_TO_STRING(pCalenderEntry[udiIndex]= .entry.dateRange.startDate.dayOfMonth), '.'); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, TO_STRING(pCalenderEntry[udiInde= x].entry.dateRange.startDate.month)); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, '.'); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, WORD_TO_STRING(pCalenderEntry[ud= iIndex].entry.dateRange.startDate.year)); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, ' ... '); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, BYTE_TO_STRING(pCalenderEntry[ud= iIndex].entry.dateRange.endDate.dayOfMonth)); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, '.'); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, TO_STRING(pCalenderEntry[udiInde= x].entry.dateRange.endDate.month)); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, '.'); =09=09=09=09=09=09sHelp :=3D CONCAT(sHelp, WORD_TO_STRING(pCalenderEntry[ud= iIndex].entry.dateRange.endDate.year)); =09=09=09=09=09=09asEntries[udiIndex] :=3D sHelp; =09 =09=09=09=09=09CmpBACnet.IEC_BACNET_CALENDAR_ENTRY_TYPE.CALENDAR_ENTRY_WEEK= _AND_DAY: =09=09=09=09=09=09// Do Something =09=09=09=09=09ELSE =09=09=09=09=09=09// Should never used =3D=3D >> Implement ErrorHandl= ing =09=09=09=09END_CASE =09=09=09=09IF pCalenderEntry[udiIndex].tag =3D CmpBACnet.IEC_BACNET_CALEND= AR_ENTRY_TYPE.CALENDAR_ENTRY_DATE THEN =09=09=09=09=09dat :=3D pCalenderEntry[udiIndex].entry.dat; =09=09=09=09END_IF =09=09=09=09IF pCalenderEntry[udiIndex].tag =3D CmpBACnet.IEC_BACNET_CALEND= AR_ENTRY_TYPE.CALENDAR_ENTRY_DATE_RANGE THEN =09=09=09=09=09dateRange :=3D pCalenderEntry[udiIndex].entry.dateRange; =09=09=09=09END_IF =09=09=09END_FOR =09=09END_IF =09END_IF END_IF