From e904cc1f301935885356ab59ec7865ae7dc1cbb6 Mon Sep 17 00:00:00 2001 From: Chad Woitas Date: Fri, 28 May 2021 10:45:57 -0600 Subject: [PATCH 1/3] One Solenoid functioning --- src/Kbuild | 4 +- src/lcec.h | 1 + src/lcec_conf.c | 2 + src/lcec_conf.h | 3 +- src/lcec_ex260.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ src/lcec_ex260.h | 23 ++++++++++++ src/lcec_main.c | 2 + 7 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 src/lcec_ex260.c create mode 100644 src/lcec_ex260.h diff --git a/src/Kbuild b/src/Kbuild index bcd7583c..44a4824a 100644 --- a/src/Kbuild +++ b/src/Kbuild @@ -34,5 +34,7 @@ lcec-objs := \ lcec_stmds5k.o \ lcec_deasda.o \ lcec_omrg5.o \ - lcec_ph3lm2rm.o + lcec_ph3lm2rm.o\ + lcec_ex260.o + diff --git a/src/lcec.h b/src/lcec.h index badc6bf0..2df5f862 100644 --- a/src/lcec.h +++ b/src/lcec.h @@ -62,6 +62,7 @@ do { \ #define LCEC_DELTA_VID 0x000001dd #define LCEC_MODUSOFT_VID 0x00000907 #define LCEC_OMRON_VID 0x00000083 +#define LCEC_SMC_VID 0x00000114 // State update period (ns) #define LCEC_STATE_UPDATE_PERIOD 1000000000LL diff --git a/src/lcec_conf.c b/src/lcec_conf.c index d333c48d..8de05a10 100644 --- a/src/lcec_conf.c +++ b/src/lcec_conf.c @@ -276,6 +276,8 @@ static const LCEC_CONF_TYPELIST_T slaveTypes[] = { // modusoft PH3LM2RM converter { "Ph3LM2RM", lcecSlaveTypePh3LM2RM, NULL }, + // modusoft PH3LM2RM converter + { "EX260", lcecSlaveTypeEX260, NULL }, { NULL } }; diff --git a/src/lcec_conf.h b/src/lcec_conf.h index b7d378e7..6798ae5b 100644 --- a/src/lcec_conf.h +++ b/src/lcec_conf.h @@ -183,7 +183,8 @@ typedef enum { lcecSlaveTypeOmrG5_KN50F, lcecSlaveTypeOmrG5_KN75F, lcecSlaveTypeOmrG5_KN150F, - lcecSlaveTypePh3LM2RM + lcecSlaveTypePh3LM2RM, + lcecSlaveTypeEX260 } LCEC_SLAVE_TYPE_T; typedef struct { diff --git a/src/lcec_ex260.c b/src/lcec_ex260.c new file mode 100644 index 00000000..845a9049 --- /dev/null +++ b/src/lcec_ex260.c @@ -0,0 +1,97 @@ +// +// Created by chad on 2021-05-28. +// + +#include "lcec_ex260.h" + +typedef struct { + hal_bit_t *sol_1a; + hal_bit_t *sol_1b; + hal_bit_t *sol_2a; + hal_bit_t *sol_2b; + hal_bit_t *sol_3a; + hal_bit_t *sol_3b; + hal_bit_t *sol_4a; + hal_bit_t *sol_4b; + hal_bit_t *sol_5a; + hal_bit_t *sol_5b; + hal_bit_t *sol_6a; + hal_bit_t *sol_6b; + hal_bit_t *sol_7a; + hal_bit_t *sol_7b; + unsigned int pdo_os; + unsigned int pdo_bp; +} lcec_ex260_pin_t; + +static const lcec_pindesc_t slave_pins[] = { + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_1a), "%s.%s.%s.sol-%d-1a" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_1b), "%s.%s.%s.sol-%d-1b" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_2a), "%s.%s.%s.sol-%d-2a" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_2b), "%s.%s.%s.sol-%d-2b" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_3a), "%s.%s.%s.sol-%d-3a" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_3b), "%s.%s.%s.sol-%d-3b" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_4a), "%s.%s.%s.sol-%d-4a" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_4b), "%s.%s.%s.sol-%d-4b" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_5a), "%s.%s.%s.sol-%d-5a" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_5b), "%s.%s.%s.sol-%d-5b" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_6a), "%s.%s.%s.sol-%d-6a" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_6b), "%s.%s.%s.sol-%d-6b" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_7a), "%s.%s.%s.sol-%d-7a" }, + { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_7b), "%s.%s.%s.sol-%d-7b" }, + { HAL_TYPE_UNSPECIFIED, HAL_DIR_UNSPECIFIED, -1, NULL } +}; + +void lcec_ex260_write(struct lcec_slave *slave, long period); + +int lcec_ex260_init(int comp_id, struct lcec_slave *slave, ec_pdo_entry_reg_t *pdo_entry_regs) { + lcec_master_t *master = slave->master; + lcec_ex260_pin_t *hal_data; + lcec_ex260_pin_t *pin; + int i; + int err; + + // initialize callbacks + slave->proc_write = lcec_ex260_write; + + // alloc hal memory + if ((hal_data = hal_malloc(sizeof(lcec_ex260_pin_t) * slave->pdo_entry_count)) == NULL) { + rtapi_print_msg(RTAPI_MSG_ERR, LCEC_MSG_PFX "hal_malloc() for slave %s.%s failed\n", master->name, slave->name); + return -EIO; + } + memset(hal_data, 0, sizeof(lcec_ex260_pin_t) * slave->pdo_entry_count); + slave->hal_data = hal_data; + + // initialize pins + for (i=0, pin=hal_data; ipdo_entry_count; i++, pin++) { + // initialize PDO entry + LCEC_PDO_INIT(pdo_entry_regs, slave->index, slave->vid, slave->pid, 0x3101, 0x01 + i, &pin->pdo_os, &pin->pdo_bp); + + if ((err = lcec_pin_newf_list(pin, slave_pins, LCEC_MODULE_NAME, master->name, slave->name, i)) != 0) { + return err; + } + + } + + return 0; +} + +void lcec_ex260_write(struct lcec_slave *slave, long period) { + lcec_master_t *master = slave->master; + lcec_ex260_pin_t *hal_data = (lcec_ex260_pin_t *) slave->hal_data; + uint8_t *pd = master->process_data; + lcec_ex260_pin_t *pin; + int i, s; + + // wait for slave to be operational + if (!slave->state.operational) { + return; + } + + // set outputs + for (i=0, pin=hal_data; ipdo_entry_count; i++, pin++) { + s = *(pin->sol_1a); + + EC_WRITE_BIT(&pd[pin->pdo_os], pin->pdo_bp, s); + } +} + diff --git a/src/lcec_ex260.h b/src/lcec_ex260.h new file mode 100644 index 00000000..d8bef32e --- /dev/null +++ b/src/lcec_ex260.h @@ -0,0 +1,23 @@ +// +// Created by chad on 2021-05-28. +// + +#ifndef _LCEC_EX260_H +#define _LCEC_EX260_H + +#include "lcec.h" + +/* Master 0, Slave 3, "EX260-SEC3" +* Vendor ID: 0x00000114 +* Product code: 0x01000003 +* Revision number: 0x00010002 +*/ + +#define LCEC_EX260_VID LCEC_SMC_VID +#define LCEC_EX260_PID 0x01000003 + +#define LCEC_EX260_PDOS 2 + +int lcec_ex260_init(int comp_id, struct lcec_slave *slave, ec_pdo_entry_reg_t *pdo_entry_regs); + +#endif //_LCEC_EX260_H diff --git a/src/lcec_main.c b/src/lcec_main.c index d5c1adbb..6babcab1 100644 --- a/src/lcec_main.c +++ b/src/lcec_main.c @@ -51,6 +51,7 @@ #include "lcec_deasda.h" #include "lcec_omrg5.h" #include "lcec_ph3lm2rm.h" +#include "lcec_ex260.h" #include "rtapi_app.h" @@ -242,6 +243,7 @@ static const lcec_typelist_t types[] = { // modusoft PH3LM2RM converter { lcecSlaveTypePh3LM2RM, LCEC_PH3LM2RM_VID, LCEC_PH3LM2RM_PID, LCEC_PH3LM2RM_PDOS, lcec_ph3lm2rm_init}, + { lcecSlaveTypeEX260, LCEC_EX260_VID, LCEC_EX260_PID, LCEC_EX260_PDOS, lcec_ex260_init}, { lcecSlaveTypeInvalid } }; From 9afb027c38a2336fac2202c57e3bf13c33588e3a Mon Sep 17 00:00:00 2001 From: Chad Woitas Date: Fri, 28 May 2021 11:55:46 -0600 Subject: [PATCH 2/3] Added in SEC1-4, Converted to 8bit functions --- src/lcec_conf.c | 5 ++++- src/lcec_conf.h | 5 ++++- src/lcec_ex260.c | 21 ++++++++------------- src/lcec_ex260.h | 12 ++++++++++-- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/lcec_conf.c b/src/lcec_conf.c index 8de05a10..a779c376 100644 --- a/src/lcec_conf.c +++ b/src/lcec_conf.c @@ -277,7 +277,10 @@ static const LCEC_CONF_TYPELIST_T slaveTypes[] = { // modusoft PH3LM2RM converter { "Ph3LM2RM", lcecSlaveTypePh3LM2RM, NULL }, // modusoft PH3LM2RM converter - { "EX260", lcecSlaveTypeEX260, NULL }, + { "EX260-SEC1", lcecSlaveTypeEX260_SEC1, NULL }, + { "EX260-SEC2", lcecSlaveTypeEX260_SEC2, NULL }, + { "EX260-SEC3", lcecSlaveTypeEX260_SEC3, NULL }, + { "EX260-SEC4", lcecSlaveTypeEX260_SEC4, NULL }, { NULL } }; diff --git a/src/lcec_conf.h b/src/lcec_conf.h index 6798ae5b..19a36b06 100644 --- a/src/lcec_conf.h +++ b/src/lcec_conf.h @@ -184,7 +184,10 @@ typedef enum { lcecSlaveTypeOmrG5_KN75F, lcecSlaveTypeOmrG5_KN150F, lcecSlaveTypePh3LM2RM, - lcecSlaveTypeEX260 + lcecSlaveTypeEX260_SEC1, + lcecSlaveTypeEX260_SEC2, + lcecSlaveTypeEX260_SEC3, + lcecSlaveTypeEX260_SEC4 } LCEC_SLAVE_TYPE_T; typedef struct { diff --git a/src/lcec_ex260.c b/src/lcec_ex260.c index 845a9049..caa9018c 100644 --- a/src/lcec_ex260.c +++ b/src/lcec_ex260.c @@ -13,12 +13,6 @@ typedef struct { hal_bit_t *sol_3b; hal_bit_t *sol_4a; hal_bit_t *sol_4b; - hal_bit_t *sol_5a; - hal_bit_t *sol_5b; - hal_bit_t *sol_6a; - hal_bit_t *sol_6b; - hal_bit_t *sol_7a; - hal_bit_t *sol_7b; unsigned int pdo_os; unsigned int pdo_bp; } lcec_ex260_pin_t; @@ -32,12 +26,6 @@ static const lcec_pindesc_t slave_pins[] = { { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_3b), "%s.%s.%s.sol-%d-3b" }, { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_4a), "%s.%s.%s.sol-%d-4a" }, { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_4b), "%s.%s.%s.sol-%d-4b" }, - { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_5a), "%s.%s.%s.sol-%d-5a" }, - { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_5b), "%s.%s.%s.sol-%d-5b" }, - { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_6a), "%s.%s.%s.sol-%d-6a" }, - { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_6b), "%s.%s.%s.sol-%d-6b" }, - { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_7a), "%s.%s.%s.sol-%d-7a" }, - { HAL_BIT, HAL_IN, offsetof(lcec_ex260_pin_t, sol_7b), "%s.%s.%s.sol-%d-7b" }, { HAL_TYPE_UNSPECIFIED, HAL_DIR_UNSPECIFIED, -1, NULL } }; @@ -90,8 +78,15 @@ void lcec_ex260_write(struct lcec_slave *slave, long period) { // set outputs for (i=0, pin=hal_data; ipdo_entry_count; i++, pin++) { s = *(pin->sol_1a); + s |= *(pin->sol_1b) << 1; + s |= *(pin->sol_2a) << 2; + s |= *(pin->sol_2b) << 3; + s |= *(pin->sol_3a) << 4; + s |= *(pin->sol_3b) << 5; + s |= *(pin->sol_4a) << 6; + s |= *(pin->sol_4b) << 7; + EC_WRITE_U8(&pd[pin->pdo_os], s); - EC_WRITE_BIT(&pd[pin->pdo_os], pin->pdo_bp, s); } } diff --git a/src/lcec_ex260.h b/src/lcec_ex260.h index d8bef32e..f67d3ad4 100644 --- a/src/lcec_ex260.h +++ b/src/lcec_ex260.h @@ -6,6 +6,7 @@ #define _LCEC_EX260_H #include "lcec.h" +#include "lcec_conf.h" /* Master 0, Slave 3, "EX260-SEC3" * Vendor ID: 0x00000114 @@ -14,9 +15,16 @@ */ #define LCEC_EX260_VID LCEC_SMC_VID -#define LCEC_EX260_PID 0x01000003 +#define LCEC_EX260_SEC1_PID 0x01000001 +#define LCEC_EX260_SEC2_PID 0x01000002 +#define LCEC_EX260_SEC3_PID 0x01000003 +#define LCEC_EX260_SEC4_PID 0x01000004 + +#define LCEC_EX260_SEC1_PDOS 4 +#define LCEC_EX260_SEC2_PDOS 4 +#define LCEC_EX260_SEC3_PDOS 2 +#define LCEC_EX260_SEC4_PDOS 2 -#define LCEC_EX260_PDOS 2 int lcec_ex260_init(int comp_id, struct lcec_slave *slave, ec_pdo_entry_reg_t *pdo_entry_regs); From f2c70b7d4879fd05fef2055804ec793bc852e17e Mon Sep 17 00:00:00 2001 From: Chad Woitas Date: Fri, 28 May 2021 12:36:04 -0600 Subject: [PATCH 3/3] Implementing Main Definitions --- src/lcec_main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lcec_main.c b/src/lcec_main.c index 6babcab1..55cad920 100644 --- a/src/lcec_main.c +++ b/src/lcec_main.c @@ -243,7 +243,10 @@ static const lcec_typelist_t types[] = { // modusoft PH3LM2RM converter { lcecSlaveTypePh3LM2RM, LCEC_PH3LM2RM_VID, LCEC_PH3LM2RM_PID, LCEC_PH3LM2RM_PDOS, lcec_ph3lm2rm_init}, - { lcecSlaveTypeEX260, LCEC_EX260_VID, LCEC_EX260_PID, LCEC_EX260_PDOS, lcec_ex260_init}, + { lcecSlaveTypeEX260_SEC1, LCEC_EX260_VID, LCEC_EX260_SEC1_PID, LCEC_EX260_SEC1_PDOS, lcec_ex260_init}, + { lcecSlaveTypeEX260_SEC2, LCEC_EX260_VID, LCEC_EX260_SEC2_PID, LCEC_EX260_SEC2_PDOS, lcec_ex260_init}, + { lcecSlaveTypeEX260_SEC3, LCEC_EX260_VID, LCEC_EX260_SEC3_PID, LCEC_EX260_SEC3_PDOS, lcec_ex260_init}, + { lcecSlaveTypeEX260_SEC4, LCEC_EX260_VID, LCEC_EX260_SEC4_PID, LCEC_EX260_SEC4_PDOS, lcec_ex260_init}, { lcecSlaveTypeInvalid } };