modmasf0.abm (F0-CP128)
10 REM ***
20 REM Use F0-CP128 as a Simple Modbus RTU Master
30 REM
40 REM Use FC 2 to Read RTU Input Status and put in C0
50 REM Use FC 4 to Read (3) RTU Analog Inputs and put in V2000,2001,2002
60 REM Use FC 5 to Write status of C1 to RTU Output
65 REM Use FC 16 to Write V2010-2015 to RTU Holding Registers
70 REM
80 REM Modbus Slave Address = 1 (RA)
90 REM Baud Rate = 9600 (BAUD)
100 REM Wait for First = 100 ms (WFF)
110 REM Wait for Last = 10 (3.5 Character Times Minimum)
120 REM Modbus Master Port = 2
125 REM ND=On Delay, FD=Off Delay, For Radio Communications
130 REM
140 REM ***
150 REM Allocate String Space and Configure Port 2
160 STRING 2561,255 : DIM LN(10)
162 RA=1 : BAUD=9600 : WFF=100 : WFL=10
170 SETPORT 3,BAUD,N,8,1,N : REM Modbus Master Port
172 REM SETPORT 2,BAUD,N,8,1,N,M : REM M (Multidrop) required for 2-wire RS485
175 SETPORT 1,9600,N,8,1,N : REM Programming Debug
180 REM ***
190 REM Initialize Request Strings
195 REM Read Input Status Request String – FC2/Data Address 0/1 Bit
200 $(1)=CHR$(RA)+CHR$(2)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(1)
201 LN(1)=6
205 REM Read Analog Inputs Request String – FC4/Data Address 0/3 Words
210 $(2)=CHR$(RA)+CHR$(4)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(3)
211 LN(2)=6
215 REM Write Output Status Request String – FC5/Data Address 0
220 $(3)=CHR$(RA)+CHR$(5)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)
221 LN(3)=6
225 REM Write Multiple Word Request String – FC16/Data Address 0/6 Words
230 $(4)=CHR$(RA)+CHR$(16)+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(6)+CHR$(12)
231 LN(4)=19
290 REM ***
291 REM Configure INPUT statement
295 IF WFL<10 THEN WFL=10 : REM WFL Must be 10 or greater
297 SETINPUT 1,1,0,255,WFF,WFL
300 REM ***
310 REM Read Input and Copy to C0
320 S=1 : GOSUB 1000
330 IF ERR<>0 THEN GOTO 300 : REM Continuous Retry
340 S06_C(0)=PICK(ASC($(0),4),B(0))
342 REM or S06_VH(40600)=ASC($(0),4)
344 REM If you use line 342 instead of 340 C0-16 will be overwritten
400 REM ***
410 REM Read Three Analog Inputs and Copy to V1400-1402
420 S=2 : GOSUB 1000
430 IF ERR<>0 THEN GOTO 400 : REM Continuous Retry
440 DPORT(0)=ASC($(0),5)
442 DPORT(1)=ASC($(0),4)
444 DPORT(2)=ASC($(0),7)
446 DPORT(3)=ASC($(0),6)
448 DPORT(4)=ASC($(0),9)
450 DPORT(5)=ASC($(0),8)
460 BMOVE W,VH(2000),VH(2003)
500 REM ***
510 REM Read C1 and write to RTU Output
520 IF S06_C(1) THEN ASC($(3),5)=255 ELSE ASC($(3),5)=0
530 S=3 : GOSUB 1000
540 IF ERR<>0 THEN GOTO 500 : REM Continuous Retry
600 REM ***
610 REM Read V2010-V2015 then write to RTU Holding Registers
620 REM V2010-V2015 and put data into request string
622 BMOVE R,VH(2010),VH(2015)
624 FOR X=0 TO 11 STEP 2
625 ASC($(4),8+X)=DPORT(X,H)
626 ASC($(4),9+X)=DPORT(X,L)
628 NEXT X
630 S=4 : GOSUB 1000
640 IF ERR<>0 THEN GOTO 600 : REM Continuous Retry
999 GOTO 300
1000 REM ***
1010 REM Send Request and Get Response in $(0)
1020 $(0)=”” : INLEN2=0
1022 PRINT1 “Txd > “;
1024 FOR C=1 TO LN(S) : PRINT1 HEX$(ASC($(S),C),1),” “; : NEXT C
1026 REM PRINT1
1030 SYSTEM(2)=NOT(0) : REM Turn ON CRC
1040 REM DTR2=1 : DELAY ND
1050 PRINT3 USING(\LN(S)\),$(S);
1060 REM DELAY FD : DTR2=0
1070 REM Input RS485 Echo – Remove or REM next line for RS232 or 422
1071 REM SETINPUT 1,1,0,LN(S)+2,1,1 : INPUT2 ,$(4) : Z=INPLEN
1072 SETINPUT 1,1,0,255,WFF,WFL : INPUT3 ,$(0)
1080 SYSTEM(2)=0 : REM Turn OFF CRC
1082 REM PRINT1 : PRINT1 “Echo < “; : REM this line and next for RS232 or 422
1084 REM FOR C=1 TO Z : PRINT1 HEX$(ASC($(4),C),1),” “; : NEXT C
1085 PRINT1 : PRINT1 “Rsp < “;
1086 FOR C=1 TO INPLEN : PRINT1 HEX$(ASC($(0),C),1),” “; : NEXT C
1087 PRINT1
1089 ERR=0
1090 IF INPLEN=0 THEN PRINT1 “NO RESPONSE” : ERR=NOT(0) : RETURN
1100 IF COMERR3 THEN PRINT1 “CRC-16 ERROR” : ERR=NOT(0) : RETURN
1110 RETURN