From: Joseph Coffland Date: Tue, 8 May 2018 23:37:17 +0000 (-0700) Subject: Preliminary FR-D700 VFD support, modbus ignore leading zeros, Fix for modbus read... X-Git-Url: https://git.buildbotics.com/?a=commitdiff_plain;h=d72b05588220e00fdcc550929919c5faf93e014f;p=bbctrl-firmware Preliminary FR-D700 VFD support, modbus ignore leading zeros, Fix for modbus read operation, Finalized AC-Tech VFD support --- diff --git a/CHANGELOG.md b/CHANGELOG.md index df8a88f..6f3be18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Buildbotics CNC Controller Firmware Changelog ============================================== +## v0.3.23 + - Fix for modbus read operation. + - Finalized AC-Tech VFD support. + - Preliminary FR-D700 VFD support. + ## v0.3.22 - Fix position loss after program pause. #130 - Correctly handle disabled axes. diff --git a/package.json b/package.json index 4678b15..648aca8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bbctrl", - "version": "0.3.22", + "version": "0.3.23", "homepage": "http://buildbotics.com/", "repository": "https://github.com/buildbotics/bbctrl-firmware", "license": "GPL-3.0+", diff --git a/src/avr/src/config.h b/src/avr/src/config.h index eb254c3..fd38b01 100644 --- a/src/avr/src/config.h +++ b/src/avr/src/config.h @@ -183,9 +183,9 @@ enum { // Modbus settings -#define MODBUS_TIMEOUT 50 // ms. response timeout +#define MODBUS_TIMEOUT 100 // ms. response timeout #define MODBUS_RETRIES 4 // Number of retries before failure -#define MODBUS_BUF_SIZE 8 // Max bytes in rx/tx buffers +#define MODBUS_BUF_SIZE 18 // Max bytes in rx/tx buffers #define VFD_QUERY_DELAY 100 // ms // Serial settings diff --git a/src/avr/src/modbus.c b/src/avr/src/modbus.c index be38400..f3c1af5 100644 --- a/src/avr/src/modbus.c +++ b/src/avr/src/modbus.c @@ -211,7 +211,10 @@ ISR(RS485_TXC_vect) { /// Data received interrupt ISR(RS485_RXC_vect) { - state.response[state.bytes++] = RS485_PORT.DATA; + state.response[state.bytes] = RS485_PORT.DATA; + + // Ignore leading zeros + if (state.bytes || state.response[0]) state.bytes++; if (state.bytes == state.response_length) { _set_rxc_interrupt(false); @@ -223,8 +226,10 @@ ISR(RS485_RXC_vect) { static void _read_cb(uint8_t func, uint8_t bytes, const uint8_t *data) { - if (func == MODBUS_READ_OUTPUT_REG && bytes == 3 && data[0] == 2) { - if (state.rw_cb) state.rw_cb(true, state.addr, _read_word(data, false)); + if (func == MODBUS_READ_OUTPUT_REG && data[0] == bytes - 1) { + if (state.rw_cb) + for (uint8_t i = 0; i < bytes >> 1; i++) + state.rw_cb(true, state.addr + i, _read_word(data + i * 2 + 1, false)); return; } @@ -379,12 +384,13 @@ void modbus_func(uint8_t func, uint8_t send, const uint8_t *data, } -void modbus_read(uint16_t addr, modbus_rw_cb_t cb) { +void modbus_read(uint16_t addr, uint16_t count, modbus_rw_cb_t cb) { state.rw_cb = cb; state.addr = addr; - uint8_t cmd[4] = {0, 0, 0, 1}; + uint8_t cmd[4]; _write_word(cmd, addr, false); - modbus_func(MODBUS_READ_OUTPUT_REG, 4, cmd, 3, _read_cb); + _write_word(cmd + 2, count, false); + modbus_func(MODBUS_READ_OUTPUT_REG, 4, cmd, 2 * count + 1, _read_cb); } diff --git a/src/avr/src/modbus.h b/src/avr/src/modbus.h index 42a7de2..90cdb12 100644 --- a/src/avr/src/modbus.h +++ b/src/avr/src/modbus.h @@ -106,6 +106,6 @@ void modbus_deinit(); bool modbus_busy(); void modbus_func(uint8_t func, uint8_t send, const uint8_t *data, uint8_t receive, modbus_cb_t cb); -void modbus_read(uint16_t addr, modbus_rw_cb_t cb); +void modbus_read(uint16_t addr, uint16_t count, modbus_rw_cb_t cb); void modbus_write(uint16_t addr, uint16_t value, modbus_rw_cb_t cb); void modbus_rtc_callback(); diff --git a/src/avr/src/spindle.h b/src/avr/src/spindle.h index b1dd5ce..2dba5ea 100644 --- a/src/avr/src/spindle.h +++ b/src/avr/src/spindle.h @@ -38,6 +38,7 @@ typedef enum { SPINDLE_TYPE_CUSTOM, SPINDLE_TYPE_YL600, SPINDLE_TYPE_AC_TECH, + SPINDLE_TYPE_FR_D700, } spindle_type_t; diff --git a/src/avr/src/vfd_spindle.c b/src/avr/src/vfd_spindle.c index ddfc790..9ad6460 100644 --- a/src/avr/src/vfd_spindle.c +++ b/src/avr/src/vfd_spindle.c @@ -53,6 +53,7 @@ typedef enum { REG_FREQ_READ, REG_FREQ_SIGN_READ, + REG_FREQ_ACTECH_READ, REG_DISCONNECT_WRITE, } vfd_reg_type_t; @@ -85,17 +86,28 @@ const vfd_reg_t yl600_regs[] PROGMEM = { // NOTE, Modbus reg = AC Tech reg + 1 const vfd_reg_t ac_tech_regs[] PROGMEM = { - {REG_CONNECT_WRITE, 49, 19}, // Password unlock - {REG_CONNECT_WRITE, 2, 512}, // Manual mode - {REG_MAX_FREQ_READ, 63, 0}, // Max frequency - {REG_FREQ_SET, 41, 0}, // Frequency - {REG_STOP_WRITE, 2, 4}, // Stop drive - {REG_FWD_WRITE, 2, 128}, // Forward - {REG_FWD_WRITE, 2, 8}, // Start drive - {REG_REV_WRITE, 2, 64}, // Reverse - {REG_REV_WRITE, 2, 8}, // Start drive - {REG_FREQ_READ, 26, 0}, // Actual speed - {REG_DISCONNECT_WRITE, 2, 2}, // Lock controls and parameters + {REG_CONNECT_WRITE, 48, 19}, // Password unlock + {REG_CONNECT_WRITE, 1, 512}, // Manual mode + {REG_MAX_FREQ_READ, 62, 0}, // Max frequency + {REG_FREQ_SET, 40, 0}, // Frequency + {REG_STOP_WRITE, 1, 4}, // Stop drive + {REG_FWD_WRITE, 1, 128}, // Forward + {REG_FWD_WRITE, 1, 8}, // Start drive + {REG_REV_WRITE, 1, 64}, // Reverse + {REG_REV_WRITE, 1, 8}, // Start drive + {REG_FREQ_ACTECH_READ, 24, 0}, // Actual speed + {REG_DISCONNECT_WRITE, 1, 2}, // Lock controls and parameters + {REG_DISABLED}, +}; + + +const vfd_reg_t fr_d700_regs[] PROGMEM = { + {REG_MAX_FREQ_READ, 1000, 0}, // Max frequency + {REG_FREQ_SET, 13, 0}, // Frequency + {REG_STOP_WRITE, 8, 1}, // Stop drive + {REG_FWD_WRITE, 8, 2}, // Forward + {REG_REV_WRITE, 8, 4}, // Reverse + {REG_FREQ_READ, 200, 0}, // Output freq {REG_DISABLED}, }; @@ -106,6 +118,7 @@ static vfd_reg_t custom_regs[VFDREG]; static struct { vfd_reg_type_t state; int8_t reg; + uint8_t read_count; bool changed; bool shutdown; @@ -127,6 +140,11 @@ static void _disconnected() { static bool _next_state() { switch (vfd.state) { + case REG_MAX_FREQ_FIXED: + if (!vfd.speed) vfd.state = REG_STOP_WRITE; + else vfd.state = REG_FREQ_SET; + break; + case REG_FREQ_SIGN_SET: if (vfd.speed < 0) vfd.state = REG_REV_WRITE; else if (0 < vfd.speed) vfd.state = REG_FWD_WRITE; @@ -137,7 +155,7 @@ static bool _next_state() { vfd.state = REG_FREQ_READ; break; - case REG_FREQ_SIGN_READ: + case REG_FREQ_ACTECH_READ: if (vfd.shutdown) vfd.state = REG_DISCONNECT_WRITE; else if (vfd.changed) { @@ -174,6 +192,7 @@ static void _next_reg() { if (vfd.reg == VFDREG) { vfd.reg = -1; + vfd.read_count = 0; if (!_next_state()) break; } else if (regs[vfd.reg].type == vfd.state && _exec_command()) break; @@ -197,6 +216,8 @@ static void _modbus_cb(bool ok, uint16_t addr, uint16_t value) { } // Handle read result + vfd.read_count++; + switch (regs[vfd.reg].type) { case REG_MAX_FREQ_READ: vfd.max_freq = value; break; case REG_FREQ_READ: vfd.actual_speed = value / (float)vfd.max_freq; break; @@ -205,6 +226,11 @@ static void _modbus_cb(bool ok, uint16_t addr, uint16_t value) { vfd.actual_speed = (int16_t)value / (float)vfd.max_freq; break; + case REG_FREQ_ACTECH_READ: + if (vfd.read_count == 2) vfd.actual_speed = value / (float)vfd.max_freq; + if (vfd.read_count < 6) return; + break; + default: break; } @@ -217,6 +243,7 @@ static bool _exec_command() { if (vfd.wait) return true; vfd_reg_t reg = regs[vfd.reg]; + uint16_t words = 1; bool read = false; bool write = false; @@ -243,6 +270,9 @@ static bool _exec_command() { write = true; break; + case REG_FREQ_ACTECH_READ: + words = 6; + case REG_FREQ_READ: case REG_FREQ_SIGN_READ: case REG_MAX_FREQ_READ: @@ -250,7 +280,7 @@ static bool _exec_command() { break; } - if (read) modbus_read(reg.addr, _modbus_cb); + if (read) modbus_read(reg.addr, words, _modbus_cb); else if (write) modbus_write(reg.addr, reg.value, _modbus_cb); else return false; @@ -278,6 +308,7 @@ void vfd_spindle_init() { case SPINDLE_TYPE_CUSTOM: memcpy(regs, custom_regs, sizeof(regs)); break; case SPINDLE_TYPE_YL600: _load(yl600_regs); break; case SPINDLE_TYPE_AC_TECH: _load(ac_tech_regs); break; + case SPINDLE_TYPE_FR_D700: _load(fr_d700_regs); break; default: break; } diff --git a/src/avr/src/vfd_test.c b/src/avr/src/vfd_test.c index 318d302..309aa6d 100644 --- a/src/avr/src/vfd_test.c +++ b/src/avr/src/vfd_test.c @@ -106,7 +106,7 @@ void command_modbus_read_exec(void *data) { uint16_t addr = *(uint16_t *)data; vt.waiting = true; - modbus_read(addr, _modbus_rw_cb); + modbus_read(addr, 1, _modbus_rw_cb); exec_set_cb(_modbus_cmd_exec); } diff --git a/src/jade/templates/control-view.jade b/src/jade/templates/control-view.jade index 6ebb988..ee9f84e 100644 --- a/src/jade/templates/control-view.jade +++ b/src/jade/templates/control-view.jade @@ -124,7 +124,7 @@ script#control-view-template(type="text/x-template") td mm/min tr th Speed - td {{state.speed || 0 | fixed 0}} + td {{state.speed || 0 | fixed 0}} ({{state.s || 0 | fixed 0}}) td RPM table.info diff --git a/src/jade/templates/indicators.jade b/src/jade/templates/indicators.jade index 511a4ff..36cdc06 100644 --- a/src/jade/templates/indicators.jade +++ b/src/jade/templates/indicators.jade @@ -167,9 +167,9 @@ script#indicators-template(type="text/x-template") td {{state['2ai'] | percent 0}} A th Analog 2 - table.rs485 + table.modbus tr - th.header(colspan=5) RS485 Spindle + th.header(colspan=5) Modbus VFD tr th(colspan=5) {{modbus_status}} diff --git a/src/resources/config-template.json b/src/resources/config-template.json index d985dfc..6da0be1 100644 --- a/src/resources/config-template.json +++ b/src/resources/config-template.json @@ -164,7 +164,7 @@ "tool-type": { "type": "enum", "values": ["Disabled", "PWM Spindle", "Huanyang VFD", "VFD Test", - "Custom Modbus VFD", "YL600 VFD", "AC-Tech VFD"], + "Custom Modbus VFD", "YL600 VFD", "AC-Tech VFD", "FR-D700"], "default": "Disabled", "code": "st" }, @@ -234,7 +234,7 @@ "max-freq-read", "max-freq-fixed", "freq-set", "freq-signed-set", "stop-write", "forward-write", "reverse-write", - "freq-read", "freq-signed-read", + "freq-read", "freq-signed-read", "freq-actech-read", "disconnect-write"], "default": "disabled", "code": "vt"