100 CLEAR : DIM RXDATA(32), DDATA(32) 110 OPEN "COM1:9600,N,8,1,CD0,CS0,DS0,OP0,RS,BIN" FOR RANDOM AS #1 120 CLS ' CLEAR SCREEN 130 PRINT " MOD-MUX MODBUS COMMS TEST PROGRAM": PRINT 140 INPUT " ENTER MODULE ID : ", NODEID 150 PRINT : PRINT " ENTER VALUES BELOW FOR MODBUS FUNCTION CODE 3 READ REGISTER COMMAND" 160 PRINT " 30000 < START ADDRESS < 40030 0 < RANGE < 9 ": PRINT 170 INPUT " ENTER MODBUS START ADDRESS : ", STLSB 180 IF STLSB > 30000 AND STLSB < 40030 THEN GOTO 210 190 PRINT "ERROR - VALUE BETWEEN 30001 AND 40029 REQUIRED" 200 GOTO 170 210 IF STLSB < 40000 THEN START = STLSB - 30001 ELSE START = STLSB - 40001 220 INPUT " ENTER RANGE : ", RGLSB 230 IF RGLSB > 0 AND RGLSB < 9 THEN GOTO 400 240 PRINT "ERROR - VALUE BETWEEN 1 AND 8 REQUIRED" 250 GOTO 220 400 DDATA(0) = NODEID ' MODULE ID 410 DDATA(1) = 3 ' MODBUS FUNCTION CODE 3 READ REGISTER 420 DDATA(2) = 0 ' START ADDRESS MSB 430 DDATA(3) = START ' START ADDRESS LSB 440 DDATA(4) = 0 ' RANGE MSB 450 DDATA(5) = RGLSB ' RANGE LSB 460 NUMBYTE = 6 ' NO. TX MESSAGE BYTES EXCLUDING CHECKSUM BYTES 470 GOSUB 2000 ' CALCULATE CHECKSUM 480 DDATA(6) = CINT(CRCREG AND 255) ' SPLIT CSM INTO HIGH AND LOW BYTES 490 DDATA(7) = CINT(CRCREG \ 256) 510 FOR K = 0 TO (NUMBYTE + 2) 520 PRINT #1, CHR$(DDATA(K)); ' OUTPUT DATA TO COMMS PORT 530 NEXT K 540 FOR K = 1 TO 10000 ' ALLOW DELAY FOR RX MESSAGE 550 NEXT K 560 IF EOF(1) = 0 THEN GOTO 600 'BUFFER NOT EMPTY THEN READ RX BYTES 570 PRINT CHR$(12) 580 PRINT "RX TIMEOUT ERROR" 590 GOTO 760 600 K = 0 ' READ TX BYTES 610 IF EOF(1) = 0 THEN GOTO 650 'BUFFER NOT EMPTY THEN GOTO 620 PRINT CHR$(12) 630 PRINT "RX MSG LENGTH ERROR" 640 GOTO 760 650 RXDATA(K) = ASC(INPUT$(1, 1)) ' READ ONE RECEIVED DATA BYTE 660 K = K + 1 670 IF K <> ((RGLSB * 2) + 5) THEN GOTO 610 700 CLS 710 PRINT " MOD-MUX MODULE ID = "; NODEID 720 FOR I = 0 TO RGLSB - 1 730 PRINT "MODBUS REGISTER"; I + STLSB; " = "; RXDATA((I * 2) + 3) * 256 + RXDATA((I * 2) + 4) 740 NEXT I 760 FOR K = 1 TO 10 770 PRINT 780 NEXT K 790 PRINT "PRESS 'C' TO CHANGE VALUES OR 'Q' TO QUIT" 800 KEYINPUT$ = INKEY$ 810 IF KEYINPUT$ = "C" THEN GOTO 120 ' CHANGE ID ETC 820 IF KEYINPUT$ = "Q" THEN GOTO 900 ' EXIT 824 IF KEYINPUT$ = "c" THEN GOTO 120 ' CHANGE ID ETC 826 IF KEYINPUT$ = "q" THEN GOTO 900 ' EXIT 830 GOTO 510 900 CLOSE #1 910 END 2000 CRCREG = 65535 ' CHECKSUM CALCULATION 2010 FOR I = 0 TO (NUMBYTE - 1) 2020 CRCREG = CRCREG XOR DDATA(I) 2030 FOR J = 0 TO 7 2040 LSB = CRCREG MOD 2 2045 CRCREG = CRCREG \ 2 2050 IF LSB <> 0 THEN CRCREG = CRCREG XOR 40961 2060 NEXT J 2070 NEXT I 2080 RETURN