Latest G-code manual states:
M65 - Output Serial
Usage: M65 H Q - H = Serial port (0 or 1)
- Q = data send to serial interface
M65 H Q E <R> <D> - H = Serial port (0 or 1)
- Q = parameter number of first data location
- E = data count
- R (optional) = parameter number for returned data
- D (optional) = returned data count
Send data to serial interface.
I know it is not much but it is something.
We will create much more tutorial, examples and also hardware for Modbus. Currently I only have some routines for relay board
Modbus RTU 8ch relay module RS485/TTL UART 8CH input 8CH out_chinalctech
mb_addrread.gcode - read board address
Code:
(print,mb_addrread:)
#<len> = 7
(array, 3000, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01)
(crc16, 3000)
(arrclr, 4000, 16)
;o<mb_printdata> exec [3000]
M65 H1 Q3001 E#3000 R4001 D#<len>
o<mb_printdata> exec [4000]
o<mb_check> exec [3000] [4000] [#<len>]
o<rc> if[#<_result> NE 0]
M99
o<rc> endif
#<addr> = #4005
(print, address read: #<addr>)
(print,--------)
M99
mb_addrwrite.gcode - write board address
Code:
(print,mb_addrwrite: #1)
#<len> = 11
(array, 3000, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00)
#3009 = #1
(crc16, 3000)
(arrclr, 4000, 16)
;o<mb_printdata> exec [3000]
M65 H1 Q3001 E#3000 R4001 D#<len>
o<mb_printdata> exec [4000]
o<mb_check> exec [3000] [4000] [#<len>]
o<rc> if[#<_result> NE 0]
M99
o<rc> endif
#<addr> = #4009
(print, address write: #<addr>)
(print,--------)
M99
mb_baudread.gcode - read current baudrate
Code:
(print,mb_baudread:)
#<len> = 7
(array, 3000, 0x00, 0x03, 0x03, 0xE8, 0x00, 0x01)
#3001 = #1
(crc16, 3000)
(arrclr, 4000, 16)
;o<mb_printdata> exec [3000]
M65 H1 Q3001 E#3000 R4001 D#<len>
o<mb_printdata> exec [4000]
o<mb_check> exec [3000] [4000] [#<len>]
o<rc> if[#<_result> NE 0]
M99
o<rc> endif
#<baud> = #4005
o<chk> if[#<baud> EQ 2]
#<baudnum> = 4800
o<chk> elseif[#<baud> EQ 3]
#<baudnum> = 9600
o<chk> elseif[#<baud> EQ 4]
#<baudnum> = 19200
o<chk> endif
(print, baud rate read: #<baud>, #<baudnum>)
(print,--------)
M99
mb_baudwrite.gcode - set new baudrate
Code:
(print,mb_baudwrite:)
#<len> = 8
(array, 3000, 0x00, 0x10, 0x03, 0xE9, 0x00, 0x01, 0x02, 0x00, 0x00)
#3001 = #1
#3009 = #2
(crc16, 3000)
(arrclr, 4000, 16)
;o<mb_printdata> exec [3000]
M65 H1 Q3001 E#3000 R4001 D#<len>
o<mb_printdata> exec [4000]
o<mb_check> exec [3000] [4000] [#<len>]
o<rc> if[#<_result> NE 0]
M99
o<rc> endif
#<baud> = #2
o<chk> if[#<baud> EQ 2]
#<baudnum> = 4800
o<chk> elseif[#<baud> EQ 3]
#<baudnum> = 9600
o<chk> elseif[#<baud> EQ 4]
#<baudnum> = 19200
o<chk> endif
(print, baud rate write: #<baud>, #<baudnum>)
(print,--------)
M99
mb_check.gcode - helper routine for checking response
Code:
;check length
o<chk> if [#[#2] NE #3]
(print,ERROR: expected length #3)
#<_result> = 1
M99
o<chk> endif
;check response
o<chk> if[#[#1+1] NE #[#2+1]]
(print,ERROR: unexpected response address)
#<_result> = 1
M99
o<chk> endif
o<chk> if[#[#1+2] NE #[#2+2]]
(print,ERROR: unexpected response command)
#<_result> = 1
M99
o<chk> endif
;check crc
#<crc11> = #[#2+1+#[#2] -2]
#<crc12> = #[#2+1+#[#2] -1]
#[#2+1+#[#2] -2] = 0
#[#2+1+#[#2] -1] = 0
#[#2] = [#[#2]-2]
(crc16, #2)
#<crc21> = #[#2+1+#[#2] -2]
#<crc22> = #[#2+1+#[#2] -1]
o<chk> if[[#<crc11> NE #<crc21>] OR [#<crc12> NE #<crc22>]]
(print,ERROR CRC is 0x#<crc21,X>#<crc22,X>, expected 0x#<crc11,X>#<crc12,X>)
#<_result> = 1
M99
o<chk> endif
#<_result> = 0
M99
mb_printdata.gcode - helper routine for printing data
Code:
(print,Data @ #1: #[#1] bytes)
#<cnt> = 0
o<loop> while[#<cnt> LT #[#1]]
#<val> = #[#1+1+#<cnt>]
(print, #<cnt>: 0x#<val,X>)
#<cnt> = [#<cnt>+1]
o<loop> endwhile
M99
mb_relay.gcode - set relay on/off
Code:
(print,mb_relay:)
#<len> = 8
(array, 3000, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00)
#3001 = #1
#3004 = #2
o<chk> if[#3 GT 0]
#3005 = 255
o<chk> else
#3005 = 0
o<chk> endif
(crc16, 3000)
(arrclr, 4000, 16)
;o<mb_printdata> exec [3000]
M65 H1 Q3001 E#3000 R4001 D#<len>
o<mb_printdata> exec [4000]
o<mb_check> exec [3000] [4000] [#<len>]
o<rc> if[#<_result> NE 0]
M99
o<rc> endif
(print,--------)
M99
mb_relayalloff.gcode - set all relays to off
Code:
(print,mb_relayalloff:)
#<len> = 8
(array, 3000, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00)
#3001 = #1
(crc16, 3000)
(arrclr, 4000, 16)
;o<mb_printdata> exec [3000]
M65 H1 Q3001 E#3000 R4001 D#<len>
o<mb_printdata> exec [4000]
o<mb_check> exec [3000] [4000] [#<len>]
o<rc> if[#<_result> NE 0]
M99
o<rc> endif
(print,--------)
M99
mb_relayallon.gcode - set all relays to on
Code:
(print,mb_relayallon:)
#<len> = 8
(array, 3000, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x08, 0x01, 0xFF)
#3001 = #1
(crc16, 3000)
(arrclr, 4000, 16)
;o<mb_printdata> exec [3000]
M65 H1 Q3001 E#3000 R4001 D#<len>
o<mb_printdata> exec [4000]
o<mb_check> exec [3000] [4000] [#<len>]
o<rc> if[#<_result> NE 0]
M99
o<rc> endif
(print,--------)
M99
Here is an example of g-code that turns relays on/off one by one in a loop (address of my board is 2):
Code:
o<mb_relayalloff> exec [2]
#<cnt> = 0
#<onoff> = 1
o<loop> repeat [160]
o<mb_relay> exec [2] [#<cnt>] [#<onoff>]
#<cnt> = [#<cnt> + 1]
o<chk> if [#<cnt> GE 8]
#<cnt> = 0
#<onoff> = [LNOT[#<onoff>]]
o<chk> endif
(print,#<cnt> #<onoff> )
G04 P0.1
o<loop> endrepeat