@@ -359,6 +359,61 @@ Script.serveFunction('CSK_MultiIOLinkSMI.writeParameterByteArray_' .. multiIOLin
359359-- Read Messages --------------------------------------------------------------------
360360---- ---------------------------------------------------------------------------------
361361
362+
363+ local ioddReadMessagesFunctions = {}
364+
365+ local function updateFunctions ()
366+ ioddReadMessagesFunctions = {}
367+ for messageName , messageInfo in pairs (ioddReadMessages ) do
368+ ioddReadMessagesFunctions [messageName ] = {}
369+ if not messageInfo .dataInfo then
370+ goto nextMessage
371+ end
372+ local includeDataMode = (messageInfo .dataInfo .ProcessData and messageInfo .dataInfo .Parameters )
373+ if includeDataMode then
374+ ioddReadMessagesFunctions [messageName ] = {
375+ ProcessData = {},
376+ Parameters = {}
377+ }
378+ for dataMode , dataModeInfo in pairs (messageInfo .dataInfo ) do
379+ if dataMode == " ProcessData" then
380+ for dataPointID , dataPointInfo in pairs (dataModeInfo ) do
381+ ioddReadMessagesFunctions [messageName ][dataMode ][dataPointID ] = {
382+ getDataFunction = readBinaryProcessData ,
383+ processFunctions = converter .getParameterReadFunctions (dataPointInfo )
384+ }
385+ end
386+ elseif dataMode == " Parameters" then
387+ for dataPointID , dataPointInfo in pairs (dataModeInfo ) do
388+ ioddReadMessagesFunctions [messageName ][dataMode ][dataPointID ] = {
389+ getDataFunction = function () return readBinaryServiceData (tonumber (dataPointInfo .info .index ), 0 ) end ,
390+ processFunctions = converter .getParameterReadFunctions (dataPointInfo )
391+ }
392+ end
393+ end
394+ end
395+ else
396+ if messageInfo .dataInfo .ProcessData then
397+ for dataPointID , dataPointInfo in pairs (messageInfo .dataInfo .ProcessData ) do
398+ ioddReadMessagesFunctions [messageName ][dataPointID ] = {
399+ getDataFunction = readBinaryProcessData ,
400+ processFunctions = converter .getParameterReadFunctions (dataPointInfo )
401+ }
402+ end
403+ elseif messageInfo .dataInfo .Parameters then
404+ for dataPointID , dataPointInfo in pairs (messageInfo .dataInfo .Parameters ) do
405+ ioddReadMessagesFunctions [messageName ][dataPointID ] = {
406+ getDataFunction = function () return readBinaryServiceData (tonumber (dataPointInfo .info .index ), 0 ) end ,
407+ processFunctions = converter .getParameterReadFunctions (dataPointInfo )
408+ }
409+ end
410+ end
411+ end
412+ :: nextMessage::
413+ end
414+ end
415+
416+
362417-- Read preconfigured message
363418--- @param messageName string Name of the message to read.
364419--- @return bool success Success of reading.
@@ -367,42 +422,65 @@ local function readIODDMessage(messageName)
367422 if not ioddReadMessages [messageName ] or not ioddReadMessages [messageName ].dataInfo then
368423 return false , " No data selected for read"
369424 end
425+ local message = {}
426+ local ts1 = DateTime .getTimestamp ()
370427 local success = true
371- local messageContent = {}
372- local includeDataMode = (ioddReadMessages [messageName ].dataInfo .ProcessData and ioddReadMessages [messageName ].dataInfo .Parameters )
373- if ioddReadMessages [messageName ].dataInfo .ProcessData then
374- local readSuccess , receivedData = readProcessData (ioddReadMessages [messageName ].dataInfo .ProcessData )
375- if not readSuccess then
376- success = false
377- end
378- if includeDataMode then
379- messageContent .ProcessData = receivedData
380- else
381- messageContent = receivedData
382- end
383- end
384- if ioddReadMessages [messageName ].dataInfo .Parameters then
385- if includeDataMode then
386- messageContent .Parameters = {}
428+ if ioddReadMessagesFunctions [messageName ].ProcessData and ioddReadMessagesFunctions [messageName ].Parameters then
429+ message = {
430+ ProcessData = {},
431+ Parameters = {}
432+ }
433+ for dataMode , dataModeInfo in pairs (ioddReadMessagesFunctions [messageName ]) do
434+ for datapointId , datapointInfo in pairs (dataModeInfo ) do
435+ message [dataMode ][datapointId ] = {}
436+ local binData = datapointInfo .getDataFunction ()
437+ if not binData then
438+ success = false
439+ for k , v in pairs (datapointInfo .processFunctions ) do
440+ if type (v ) == " function" then
441+ message [dataMode ][datapointId ][k ] = " null"
442+ else
443+ message [dataMode ][datapointId ][k ] = {value = " null" }
444+ end
445+ end
446+ else
447+ for k , v in pairs (datapointInfo .processFunctions ) do
448+ if type (v ) == " function" then
449+ message [dataMode ][datapointId ][k ] = v (binData )
450+ else
451+ message [dataMode ][datapointId ][k ] = {value = v .value (binData )}
452+ end
453+ end
454+ end
455+ end
387456 end
388- for dataPointID , dataPointInfo in pairs (ioddReadMessages [messageName ].dataInfo .Parameters ) do
389- local readSuccess , receivedData = readParameter (dataPointInfo )
390- if not readSuccess then
457+ else
458+ for datapointId , datapointInfo in pairs (ioddReadMessagesFunctions [messageName ]) do
459+ message [datapointId ] = {}
460+ local binData = datapointInfo .getDataFunction ()
461+ if not binData then
391462 success = false
392- end
393- if includeDataMode then
394- messageContent .Parameters [dataPointID ] = receivedData
463+ for k , v in pairs (datapointInfo .processFunctions ) do
464+ if type (v ) == " function" then
465+ message [datapointId ][k ] = " null"
466+ else
467+ message [datapointId ][k ] = {value = " null" }
468+ end
469+ end
395470 else
396- messageContent [dataPointID ] = receivedData
471+ for k , v in pairs (datapointInfo .processFunctions ) do
472+ if type (v ) == " function" then
473+ message [datapointId ][k ] = v (binData )
474+ else
475+ message [datapointId ][k ] = {value = v .value (binData )}
476+ end
477+ end
397478 end
398479 end
399480 end
400- local jsonMessageContent = json .encode (messageContent )
401- ioddReadMessagesResults [messageName ] = success
402- ioddLatestReadMessages [messageName ] = jsonMessageContent
403- return success , jsonMessageContent
481+ return success , json .encode (message )
404482end
405- Script .serveFunction (' CSK_MultiIOLinkSMI.readIODDMessage' .. multiIOLinkSMIInstanceNumberString , readIODDMessage , ' string:1:' , ' bool:1: ,string:?:' )
483+ Script .serveFunction (' CSK_MultiIOLinkSMI.readIODDMessage' .. multiIOLinkSMIInstanceNumberString , readIODDMessage , ' string:1:' , ' bool:1,string:?:' )
406484
407485--- Update configuration of read messages
408486local function updateIODDReadMessages ()
@@ -419,19 +497,7 @@ local function updateIODDReadMessages()
419497 end
420498 ioddReadMessagesTimers = {}
421499 ioddReadMessagesRegistrations = {}
422- for messageName , messageInfo in pairs (ioddReadMessages ) do
423- if helperFuncs .getTableSize (messageInfo .dataInfo ) == 0 then
424- goto nextMessage
425- end
426- for dataMode , dataModeInfo in pairs (messageInfo .dataInfo ) do
427- if dataMode == " ProcessData" or dataMode == " Parameters" then
428- for dataPointID , dataPointInfo in pairs (dataModeInfo ) do
429- ioddReadMessages [messageName ].dataInfo [dataMode ][dataPointID ] = converter .renameDatatype (dataPointInfo )
430- end
431- end
432- end
433- :: nextMessage::
434- end
500+ updateFunctions ()
435501 local queueFunctions = {}
436502 for messageName , messageInfo in pairs (ioddReadMessages ) do
437503 if helperFuncs .getTableSize (messageInfo .dataInfo ) == 0 then
@@ -447,6 +513,8 @@ local function updateIODDReadMessages()
447513 end
448514 local timestamp1 = DateTime .getTimestamp ()
449515 local success , jsonMessageContent = readIODDMessage (messageName )
516+ ioddReadMessagesResults [messageName ] = success
517+ ioddLatestReadMessages [messageName ] = jsonMessageContent
450518 local errorMessage = ' '
451519 local queueSize = ioddReadMessagesQueue :getSize ()
452520 if not success then
0 commit comments