17#if PC_ENABLE_EUROMAP77
29 IMM_MES_INTERFACE = 7000,
31 MACHINEINFORMATION = 7100,
32 MI_MANUFACTURER = 7101,
35 MI_PRODUCTCODE = 7104,
39 MI_MANUFACTURERURI = 7108,
43 MS_MACHINEMODE = 7202,
50 AJ_PRODUCTNAME = 7314,
52 AJ_EXPECTEDCYCLE = 7316,
53 AJ_NUMCAVITIES = 7317,
54 AJ_NOMINALPARTS = 7318,
55 ACTIVEJOBVALUES = 7320,
56 AJV_JOBCYCLECOUNTER = 7321,
57 AJV_MACHINECYCLECOUNTER = 7322,
58 AJV_LASTCYCLETIME = 7323,
59 AJV_AVERAGECYCLETIME = 7324,
60 AJV_JOBPARTSCOUNTER = 7325,
61 AJV_JOBGOODPARTSCOUNTER = 7326,
62 AJV_JOBBADPARTSCOUNTER = 7327,
73EuroMap77Ctx s_em77 = {
nullptr};
76void set_str(OpcUaVariant *o,
const char *s)
78 o->type = OpcUaVariantType::OPCUA_VAR_STRING;
80 o->str_len = (int32_t)strnlen(o->str, 0xFFFF);
82void set_u32(OpcUaVariant *o, uint32_t v)
84 o->type = OpcUaVariantType::OPCUA_VAR_UINT32;
87void set_u64(OpcUaVariant *o, uint64_t v)
89 o->type = OpcUaVariantType::OPCUA_VAR_UINT64;
92void set_i32(OpcUaVariant *o, int32_t v)
94 o->type = OpcUaVariantType::OPCUA_VAR_INT32;
97void set_f64(OpcUaVariant *o,
double v)
99 o->type = OpcUaVariantType::OPCUA_VAR_DOUBLE;
102void set_bool(OpcUaVariant *o,
bool v)
104 o->type = OpcUaVariantType::OPCUA_VAR_BOOL;
111int32_t add_ref(OpcUaReference *out, int32_t n, uint32_t max, uint32_t target_id,
const char *name, uint32_t node_class,
112 bool organizes =
false)
114 if ((uint32_t)n >= max)
118 OpcUaReference *r = &out[n];
119 r->ref_type_id = organizes ? OPCUA_REFTYPE_ORGANIZES : OPCUA_REFTYPE_HAS_COMPONENT;
120 r->is_forward =
true;
122 r->target_id = target_id;
124 r->browse_name = name;
125 r->display_name = name;
126 r->node_class = node_class;
128 (node_class == OPCUA_NODECLASS_VARIABLE) ? OPCUA_TYPEDEF_BASE_DATA_VARIABLE : OPCUA_TYPEDEF_BASE_OBJECT;
131int32_t add_obj(OpcUaReference *out, int32_t n, uint32_t max, uint32_t
id,
const char *name)
133 return add_ref(out, n, max,
id, name, OPCUA_NODECLASS_OBJECT);
135int32_t add_var(OpcUaReference *out, int32_t n, uint32_t max, uint32_t
id,
const char *name)
137 return add_ref(out, n, max,
id, name, OPCUA_NODECLASS_VARIABLE);
144void pc_em77_bind(
const EmImm *imm)
149bool pc_em77_read(uint16_t ns, uint32_t
id, uint32_t attribute, OpcUaVariant *out)
151 const EmImm *imm = s_em77.imm;
152 if (!imm || ns !=
PC_EM77_NS || attribute != OPCUA_ATTR_VALUE)
159 case MI_MANUFACTURER:
160 set_str(out, imm->info.manufacturer);
163 set_str(out, imm->info.model);
166 set_str(out, imm->info.serial_number);
169 set_str(out, imm->info.product_code);
172 set_str(out, imm->info.hardware_revision);
175 set_str(out, imm->info.software_revision);
178 set_str(out, imm->info.device_revision);
180 case MI_MANUFACTURERURI:
181 set_str(out, imm->info.manufacturer_uri);
185 set_bool(out, imm->status.is_present);
188 set_i32(out, (int32_t)imm->status.machine_mode);
192 set_str(out, imm->active_job.job_name);
195 set_str(out, imm->active_job.job_description);
198 set_str(out, imm->active_job.material);
201 set_str(out, imm->active_job.product_name);
204 set_str(out, imm->active_job.mould_id);
206 case AJ_EXPECTEDCYCLE:
207 set_f64(out, imm->active_job.expected_cycle_time);
210 set_u32(out, imm->active_job.num_cavities);
212 case AJ_NOMINALPARTS:
213 set_u64(out, imm->active_job.nominal_parts);
216 case AJV_JOBCYCLECOUNTER:
217 set_u64(out, imm->active_job_values.job_cycle_counter);
219 case AJV_MACHINECYCLECOUNTER:
220 set_u64(out, imm->active_job_values.machine_cycle_counter);
222 case AJV_LASTCYCLETIME:
223 set_f64(out, imm->active_job_values.last_cycle_time);
225 case AJV_AVERAGECYCLETIME:
226 set_f64(out, imm->active_job_values.average_cycle_time);
228 case AJV_JOBPARTSCOUNTER:
229 set_u64(out, imm->active_job_values.job_parts_counter);
231 case AJV_JOBGOODPARTSCOUNTER:
232 set_u64(out, imm->active_job_values.job_good_parts_counter);
234 case AJV_JOBBADPARTSCOUNTER:
235 set_u64(out, imm->active_job_values.job_bad_parts_counter);
238 set_i32(out, (int32_t)imm->active_job_values.job_status);
245int32_t pc_em77_browse(uint16_t ns, uint32_t
id, OpcUaReference *out, uint32_t max)
247 const EmImm *imm = s_em77.imm;
254 if (ns == 0 &&
id == 85)
256 return add_ref(out, 0, max, IMM_MES_INTERFACE, imm->name ? imm->name :
"IMM_MES_Interface",
257 OPCUA_NODECLASS_OBJECT, true);
268 case IMM_MES_INTERFACE:
269 n = add_obj(out, n, max, MACHINEINFORMATION,
"MachineInformation");
270 n = add_obj(out, n, max, MACHINESTATUS,
"MachineStatus");
271 n = add_obj(out, n, max, JOBS,
"Jobs");
273 case MACHINEINFORMATION:
274 n = add_var(out, n, max, MI_MANUFACTURER,
"Manufacturer");
275 n = add_var(out, n, max, MI_MODEL,
"Model");
276 n = add_var(out, n, max, MI_SERIAL,
"SerialNumber");
277 n = add_var(out, n, max, MI_PRODUCTCODE,
"ProductCode");
278 n = add_var(out, n, max, MI_HWREV,
"HardwareRevision");
279 n = add_var(out, n, max, MI_SWREV,
"SoftwareRevision");
280 n = add_var(out, n, max, MI_DEVREV,
"DeviceRevision");
281 n = add_var(out, n, max, MI_MANUFACTURERURI,
"ManufacturerUri");
284 n = add_var(out, n, max, MS_ISPRESENT,
"IsPresent");
285 n = add_var(out, n, max, MS_MACHINEMODE,
"MachineMode");
288 n = add_obj(out, n, max, ACTIVEJOB,
"ActiveJob");
289 n = add_obj(out, n, max, ACTIVEJOBVALUES,
"ActiveJobValues");
292 n = add_var(out, n, max, AJ_JOBNAME,
"JobName");
293 n = add_var(out, n, max, AJ_JOBDESC,
"JobDescription");
294 n = add_var(out, n, max, AJ_MATERIAL,
"Material");
295 n = add_var(out, n, max, AJ_PRODUCTNAME,
"ProductName");
296 n = add_var(out, n, max, AJ_MOULDID,
"MouldId");
297 n = add_var(out, n, max, AJ_EXPECTEDCYCLE,
"ExpectedCycleTime");
298 n = add_var(out, n, max, AJ_NUMCAVITIES,
"NumCavities");
299 n = add_var(out, n, max, AJ_NOMINALPARTS,
"NominalParts");
301 case ACTIVEJOBVALUES:
302 n = add_var(out, n, max, AJV_JOBCYCLECOUNTER,
"JobCycleCounter");
303 n = add_var(out, n, max, AJV_MACHINECYCLECOUNTER,
"MachineCycleCounter");
304 n = add_var(out, n, max, AJV_LASTCYCLETIME,
"LastCycleTime");
305 n = add_var(out, n, max, AJV_AVERAGECYCLETIME,
"AverageCycleTime");
306 n = add_var(out, n, max, AJV_JOBPARTSCOUNTER,
"JobPartsCounter");
307 n = add_var(out, n, max, AJV_JOBGOODPARTSCOUNTER,
"JobGoodPartsCounter");
308 n = add_var(out, n, max, AJV_JOBBADPARTSCOUNTER,
"JobBadPartsCounter");
309 n = add_var(out, n, max, AJV_JOBSTATUS,
"JobStatus");
316void pc_em77_install(
const EmImm *imm)
319 pc_opcua_set_read_handler(pc_em77_read);
320 pc_opcua_set_browse_handler(pc_em77_browse);
EUROMAP 77 / OPC 40077 - OPC UA for injection moulding machines (IMM <-> MES), the IMM_MES_Interface ...
#define PC_EM77_NS
NamespaceIndex the EUROMAP 77 IMM_MES_Interface nodes live at (default 1).