167 lines
5.2 KiB
JavaScript
167 lines
5.2 KiB
JavaScript
/**
|
|
* SOES EEPROM generator
|
|
* Shared constants, data types
|
|
|
|
* This tool serves as:
|
|
- EtherCAT Slave Information XML + EEPROM binary generator
|
|
- SOES code generator
|
|
|
|
* Victor Sluiter 2013-2018
|
|
* Kuba Buda 2020-2021
|
|
*/
|
|
'use strict'
|
|
|
|
const automaticCodegen = true; // code is regenerated on every form change.
|
|
// no need to remember to generate before copying or downloading
|
|
// app is noticeably slower
|
|
|
|
// ####################### Constants, lookup tables ####################### //
|
|
/** CoE Object Types */
|
|
const OTYPE = {
|
|
VAR : 'VAR',
|
|
ARRAY : 'ARRAY',
|
|
RECORD: 'RECORD',
|
|
};
|
|
/** CoE Data Types */
|
|
const DTYPE = {
|
|
BOOLEAN : 'BOOLEAN',
|
|
INTEGER8 : 'INTEGER8',
|
|
INTEGER16 : 'INTEGER16',
|
|
INTEGER32 : 'INTEGER32',
|
|
INTEGER64 : 'INTEGER64',
|
|
UNSIGNED8 : 'UNSIGNED8',
|
|
UNSIGNED16 : 'UNSIGNED16',
|
|
UNSIGNED32 : 'UNSIGNED32',
|
|
UNSIGNED64 : 'UNSIGNED64',
|
|
REAL32 : 'REAL32',
|
|
REAL64 : 'REAL64',
|
|
VISIBLE_STRING : 'VISIBLE_STRING',
|
|
/* TODO implement missing less common types */
|
|
// OCTET_STRING : 'OCTET_STRING',
|
|
// UNICODE_STRING : 'UNICODE_STRING',
|
|
// INTEGER24 : 'INTEGER24',
|
|
// UNSIGNED24 : 'UNSIGNED24',
|
|
// INTEGER64 : 'INTEGER64',
|
|
// UNSIGNED64 : 'UNSIGNED64',
|
|
// REAL64 : 'REAL64',
|
|
// PDO_MAPPING : 'PDO_MAPPING',
|
|
};
|
|
/** Data types bitsize as used in objectlist.c */
|
|
const dtype_bitsize = {
|
|
'BOOLEAN' : 1,
|
|
'INTEGER8' : 8,
|
|
'INTEGER16' : 16,
|
|
'INTEGER32' : 32,
|
|
'INTEGER64' : 64,
|
|
'UNSIGNED8' : 8,
|
|
'UNSIGNED16' : 16,
|
|
'UNSIGNED32' : 32,
|
|
'UNSIGNED64' : 64,
|
|
'REAL32' : 32,
|
|
'REAL64' : 64,
|
|
'VISIBLE_STRING' : 8,
|
|
};
|
|
const booleanPaddingBitsize = 7;
|
|
/** ESI XML data type */
|
|
const ESI_DT = {
|
|
'BOOLEAN': { name: 'BOOL', bitsize: 1, ctype: 'uint8_t' },
|
|
'INTEGER8': { name: 'SINT', bitsize: 8, ctype: 'int8_t' },
|
|
'INTEGER16': { name: 'INT', bitsize: 16, ctype: 'int16_t' },
|
|
'INTEGER32': { name: 'DINT', bitsize: 32, ctype: 'int32_t' },
|
|
'INTEGER64': { name: 'LINT', bitsize: 64, ctype: 'int64_t' },
|
|
'UNSIGNED8': { name: 'USINT', bitsize: 8, ctype: 'uint8_t' },
|
|
'UNSIGNED16': { name: 'UINT', bitsize: 16, ctype: 'uint16_t' },
|
|
'UNSIGNED32': { name: 'UDINT', bitsize: 32, ctype: 'uint32_t' },
|
|
'UNSIGNED64': { name: 'ULINT', bitsize: 64, ctype: 'uint64_t' },
|
|
'REAL32': { name: 'REAL', bitsize: 32, ctype: 'float' },
|
|
'REAL64': { name: 'LREAL', bitsize: 64, ctype: 'double' },
|
|
'VISIBLE_STRING': { name: 'STRING', bitsize: 8, ctype: 'char *' }, // TODO check C type name
|
|
};
|
|
|
|
/** These are required by minimal CiA 301 device */
|
|
const SDO_category = {
|
|
'1000': 'm',
|
|
'1009': 'o',
|
|
};
|
|
|
|
// ####################### Object Dictionary building ####################### //
|
|
/**
|
|
* Returns Object Dictionaty stub with mandatory objects.
|
|
* OD index is hexadecimal value without '0x' prefix
|
|
*/
|
|
function getMandatoryObjects() {
|
|
const OD = {
|
|
'1000': { otype: OTYPE.VAR, dtype: DTYPE.UNSIGNED32, name: 'Device Type', value: 0x1389 },
|
|
'1008': { otype: OTYPE.VAR, dtype: DTYPE.VISIBLE_STRING, name: 'Device Name', data: '' },
|
|
'1009': { otype: OTYPE.VAR, dtype: DTYPE.VISIBLE_STRING, name: 'Hardware Version', data: '' },
|
|
'100A': { otype: OTYPE.VAR, dtype: DTYPE.VISIBLE_STRING, name: 'Software Version', data: '' },
|
|
'1018': { otype: OTYPE.RECORD, name: 'Identity Object', items: [
|
|
{ name: 'Max SubIndex' },
|
|
{ name: 'Vendor ID', dtype: DTYPE.UNSIGNED32, value: 600 },
|
|
{ name: 'Product Code', dtype: DTYPE.UNSIGNED32 },
|
|
{ name: 'Revision Number', dtype: DTYPE.UNSIGNED32 },
|
|
{ name: 'Serial Number', dtype: DTYPE.UNSIGNED32, data: '&Obj.serial' },
|
|
]},
|
|
'1C00': { otype: OTYPE.ARRAY, dtype: DTYPE.UNSIGNED8, name: 'Sync Manager Communication Type', items: [
|
|
{ name: 'Max SubIndex' },
|
|
{ name: 'Communications Type SM0', value: 1 },
|
|
{ name: 'Communications Type SM1', value: 2 },
|
|
{ name: 'Communications Type SM2', value: 3 },
|
|
{ name: 'Communications Type SM3', value: 4 },
|
|
]},
|
|
};
|
|
return OD;
|
|
};
|
|
|
|
const sdo = 'sdo';
|
|
const txpdo = 'txpdo';
|
|
const rxpdo = 'rxpdo';
|
|
|
|
/** EtherCAT Slave Chips that are supported by this web tool */
|
|
const SupportedESC = {
|
|
AX58100: 'AX58100',
|
|
ET1100: 'ET1100',
|
|
LAN9252: 'LAN9252',
|
|
LAN9253_Beckhoff: 'LAN9253 Beckhoff',
|
|
};
|
|
|
|
/** ESCs that are using reserved bytes for configuration, for example AX58100 configdata reaches 0x0A byte */
|
|
const configOnReservedBytes = [SupportedESC.AX58100, SupportedESC.LAN9253_Beckhoff];
|
|
|
|
//** Form default values */
|
|
function getFormDefaultValues() {
|
|
return {form: {
|
|
VendorName: "ACME EtherCAT Devices",
|
|
VendorID: "0x000",
|
|
ProductCode: "0x00ab123",
|
|
ProfileNo: "5001",
|
|
RevisionNumber: "0x002",
|
|
SerialNumber: "0x001",
|
|
HWversion: "0.0.1",
|
|
SWversion: "0.0.1",
|
|
EEPROMsize: "2048",
|
|
RxMailboxOffset: "0x1000",
|
|
TxMailboxOffset: "0x1200",
|
|
MailboxSize: "512",
|
|
SM2Offset: "0x1600",
|
|
SM3Offset: "0x1A00",
|
|
TextGroupType: "DigIn",
|
|
TextGroupName5: "Digital input",
|
|
ImageName: "IMGCBY",
|
|
TextDeviceType: "DigIn2000",
|
|
TextDeviceName: "2-channel Hypergalactic input superimpermanator",
|
|
Port0Physical: "Y",
|
|
Port1Physical: "Y",
|
|
Port2Physical: " ",
|
|
Port3Physical: " ",
|
|
ESC: SupportedESC.ET1100,
|
|
SPImode: "3",
|
|
CoeDetailsEnableSDO: true,
|
|
CoeDetailsEnableSDOInfo: true,
|
|
CoeDetailsEnablePDOAssign: false,
|
|
CoeDetailsEnablePDOConfiguration: false,
|
|
CoeDetailsEnableUploadAtStartup: true,
|
|
CoeDetailsEnableSDOCompleteAccess: false,
|
|
}};
|
|
};
|