Skip to content

Connect IoT - Fuji Nexim Driver#

As products become more varied, the shift toward variable-mix variable-volume production is accelerating. Changes to bewildering production schedules and frequent machine changes lead to defective products and missed deadlines, and several other difficult problems are arising such as increasing inventories of materials, parts, and products.

Nexim is a production system that integrates the functions of the production cycle (Plan, Do, See) for reliable planning support and changeover support, flexible data management, and maintaining high operation rates and quality.

Data Types#

These are the supported specific data types:

Name Description
Integer Integer number
Numeric Decimal number
String String value
Boolean Boolean value
DateTime Date/Time value
Object JSON formatted value

Table: Fuji Nexim specific data types.

Supported Functionalities#

The FujiNexim tasks package (controller-engine-fujinexim-tasks) has direct support for the following tasks/functionalities:

Task FujiNexim Functionality Description
onFujiNeximRequest, sendFujiNeximReply BOMLIST BOM list notification
onFujiNeximRequest, sendFujiNeximReply MCSTATECHANGE Machine state change notification
onFujiNeximRequest, sendFujiNeximReply PCBCHECKIN Panel checkin notification
onFujiNeximRequest, sendFujiNeximReply PCBCHECKOUT Panel checkout notification
onFujiNeximRequest, sendFujiNeximReply PGCHANGE Program change completion notification
onFujiNeximRequest, sendFujiNeximReply PGCHANGEII Program change completion report II
onFujiNeximRequest, sendFujiNeximReply PRODSTARTED Production start notification
onFujiNeximRequest, sendFujiNeximReply PRODCOMPLETED Production completed notification
executeFujiNeximCommand PARTSSUPPLY Part supply
executeFujiNeximCommand RESTARTEQUIP Fuji equipment control release command
executeFujiNeximCommand STOPEQUIP Fuji equipment control command
executeFujiNeximCommand SETEV Valid event setting notification
executeFujiNeximCommand STARTEV Event notice commencement notification
(integrated on driver) KEEPALIVE Connection check request

The table lists the already pre-configured message format list. The tasks onFujiNeximRequest, sendFujiNeximReply and executeFujiNeximCommand have support to add other messages on the specification.

For example, the SetEv message is a complex one (uses Object at input). An example of one workflow that injects a complex input is:

{
    "tasks": [
        {
            "id": "task_815",
            "reference": {
                "name": "executeFujiNeximCommand",
                "package": {
                    "name": "@criticalmanufacturing/connect-iot-controller-engine-fujinexim-tasks",
                    "version": "9.0.0"
                }
            },
            "settings": {
                "inputs": [
                    {
                        "name": "machineName",
                        "propertyName": "MachineName",
                        "deviceType": {
                            "$type": "Cmf.Foundation.BusinessObjects.AutomationProtocolDataType, Cmf.Foundation.BusinessObjects",
                            "Name": "String"
                        },
                        "defaultValue": null,
                        "valueType": {
                            "collectionType": null,
                            "friendlyName": "machineName",
                            "type": 4
                        }
                    },
                    {
                        "name": "eventList",
                        "propertyName": "EventList",
                        "deviceType": {
                            "$type": "Cmf.Foundation.BusinessObjects.AutomationProtocolDataType, Cmf.Foundation.BusinessObjects",
                            "Name": "Object"
                        },
                        "defaultValue": null,
                        "valueType": {
                            "collectionType": null,
                            "friendlyName": "eventList",
                            "type": 10
                        }
                    }
                ],
                "outputs": [
                    {
                        "name": "timestamp",
                        "valueType": {
                            "collectionType": null,
                            "friendlyName": "timestamp",
                            "type": 2
                        },
                        "propertyName": "timestamp",
                        "defaultValue": null,
                        "deviceType": null
                    },
                    {
                        "name": "eventRawData",
                        "valueType": {
                            "collectionType": null,
                            "friendlyName": "rawData",
                            "type": null
                        },
                        "propertyName": "eventRawData",
                        "defaultValue": null,
                        "deviceType": null
                    },
                    {
                        "name": "output$machineName",
                        "propertyName": "MachineName",
                        "deviceType": {
                            "$type": "Cmf.Foundation.BusinessObjects.AutomationProtocolDataType, Cmf.Foundation.BusinessObjects",
                            "Name": "String"
                        },
                        "defaultValue": null,
                        "valueType": {
                            "collectionType": null,
                            "friendlyName": "machineName",
                            "type": 4
                        }
                    },
                    {
                        "name": "output$result",
                        "propertyName": "Result",
                        "deviceType": {
                            "$type": "Cmf.Foundation.BusinessObjects.AutomationProtocolDataType, Cmf.Foundation.BusinessObjects",
                            "Name": "Boolean"
                        },
                        "defaultValue": null,
                        "valueType": {
                            "collectionType": null,
                            "friendlyName": "result",
                            "type": 3
                        }
                    }
                ],
                "timeout": 10000,
                "executionMode": 1,
                "executionDestination": 0,
                "message": {
                    "displayName": "SetEv - Valid Event Setting"
                },
                "messageFullName": "SETEV",
                "clearInputs": true,
                "___cmf___name": "Execute Fuji Nexim Command"
            },
            "driver": "Handler"
        },
        {
            "id": "task_1305",
            "reference": {
                "name": "timer",
                "package": {
                    "name": "@criticalmanufacturing/connect-iot-controller-engine-core-tasks",
                    "version": "8.2.0-202107125"
                }
            },
            "settings": {
                "_timerType": "Timer",
                "_timerWorkingMode": "UntilDeactivation",
                "_autoActivate": true,
                "interval": 10000,
                "_numberOfOccurrencesAllowed": 30,
                "_cronExpression": "* * * * * *",
                "_timeZone": "Etc/UTC",
                "emitInNewContext": false
            }
        }
    ],
    "converters": [
        {
            "id": "@criticalmanufacturing/connect-iot-controller-engine-core-tasks#anyToConstant",
            "reference": {
                "name": "anyToConstant",
                "package": {
                    "name": "@criticalmanufacturing/connect-iot-controller-engine-core-tasks",
                    "version": "8.2.0-202107125"
                }
            }
        }
    ],
    "links": [
        {
            "id": "c423cc13-7c24-4767-8c9a-4cd152365748",
            "sourceId": "task_1305",
            "targetId": "task_815",
            "inputName": "eventList",
            "outputName": "timestamp",
            "converters": [
                {
                    "id": "@criticalmanufacturing/connect-iot-controller-engine-core-tasks#anyToConstant",
                    "params": {
                        "type": 10,
                        "value": " [ {\"EventName\":\"EventName1\", \"Ack\":\"1\"},  {\"EventName\":\"EventName2\", \"Ack\":\"1\"}]   "
                    }
                }
            ]
        }
    ]
}

This workflow will send the following message:

<NUL><NUL><NUL>{3E}<STX>SETEV<TAB>483554<TAB>MachineNameExample<TAB>2<CR>EventName1<TAB><CR>EventName2<TAB><CR><ETX> `

Protocol Parameters#

The protocol supports the following parameters, used to define the communication parameters, as well as the expected behavior of the driver:

Name Type Possible Values Default Value Description
address String "0.0.0.0" Address where the Fuji Interface is listening.
port Integer 0 Port where Fuji Interface is listening.
localAddress String "0.0.0.0" Local address the socket should connect from. Used when multiple network cards are available.
localPort Integer 0 Local port the socket should connect from.
family Enum IPV4, IPV6 IPV4 Version of IP stack, can be either 4 or 6. Default: 4.
keepAliveTime Integer 10000 Time interval to send the KEEPALIVEmessage (ms).
autoConfigure Boolean true Auto configure (SETEV and STARTEV).
machineName String "" Machine names used on Auto configure (comma separated values)
keepAliveTimeout Integer 150000 The Central Server issues a connection check request (KEEPALIVE) to the host computer at regular intervals (default: 120 seconds). KEEPALIVE timeout (ms) - timeout to receive a KEEPALIVE from equipment (default: 150 seconds).
controllerRequestTimeout Integer 10000 Timeout to Requests sent to equipment (ms).
equipmentRequestTimeout Integer 10000 Timeout to Requests sent to controller (ms).

Table: Fuji Nexim specific parameters.

Driver Extensions#

This protocol driver provides a set of extension that allow the customization to perform actions that are independent of the Driver Definitions associated. This means you can, using customization, register events that are not present in the Driver Definition.

This is particularly useful when accessing equipment data that is shared/too complex to access using the regular mechanisms. Also useful when needing to access data whose naming convention may vary from device to device.

Objects#

The objects are structures that are either passed as parameters or returned as result values.

RegisterHandler#

Name Type Description
event Event Event to register (full information)

Table: Fuji Nexim specific handler registration.

UnregisterHandler#

Name Type Description
event Event Event to unregister (at least the property name must be supplied)

Table: Fuji Nexim specific handler unregistration.

Methods#

Register Event#

Notifies the protocol driver to raise the occurrences of a specific Fuji Nexim message type when it occurs.

void connect.iot.driver.fujinexim.registerEvent(data: Event)

Example#

Notify connect.iot.driver.fujinexim.registerEvent

{
  "name": "PgChange",
  "deviceId": "PGCHANGE",
  "isEnabled": true,
  "properties": [
    {
      "name": "time",
      "deviceId": "Time",
      "deviceType": "DateTime",
      "dataType": "DateTime"
    },
    {
      "name": "lineName",
      "deviceId": "LineName",
      "deviceType": "String",
      "dataType": "String"
    },
    {
      "name": "machineName",
      "deviceId": "MachineName",
      "deviceType": "String",
      "dataType": "String"
    },
    {
      "name": "moduleNo",
      "deviceId": "ModuleNo",
      "deviceType": "Integer",
      "dataType": "Integer"
    },
    {
      "name": "laneNo",
      "deviceId": "LaneNo",
      "deviceType": "Integer",
      "dataType": "Integer"
    },
    {
      "name": "programName",
      "deviceId": "ProgramName",
      "deviceType": "String",
      "dataType": "String"
    }
  ]
}

Custom Event Example#

{
    "name": "PARTSOUTWARNING", "deviceId": "PARTSOUTWARNING", "isEnabled": true, "extendedData": { "eventType": "Request" },
    "properties":
    [
        { "name": "time", "deviceId": "Time", "dataType": "String", "deviceType": "String", "isReadable": true, "isWritable": true },
        { "name": "lineName", "deviceId": "LineName", "dataType": "String", "deviceType": "String", "isReadable": true, "isWritable": true },
        { "name": "machineName", "deviceId": "MachineName", "dataType": "String", "deviceType": "String", "isReadable": true, "isWritable": true },
        { "name": "moduleNo", "deviceId": "ModuleNo", "dataType": "Integer", "deviceType": "Integer", "isReadable": true, "isWritable": true },
        {
            "name": "partsOutInfo", "deviceId": "PartsOutInfo", "dataType": "Object", "deviceType": "Object", "extendedData":
            {
                "content": [
                    {
                        "name": "Stage",
                        "deviceType": "Integer",
                        "dataType": "Integer",
                        "isArray": false
                    },
                    {
                        "name": "Slot",
                        "deviceType": "Integer",
                        "dataType": "Integer",
                        "isArray": false
                    },
                    {
                        "name": "PartNo",
                        "deviceType": "Integer",
                        "dataType": "Integer",
                        "isArray": false
                    },
                    {
                        "name": "ReelID",
                        "deviceType": "Integer",
                        "dataType": "Integer",
                        "isArray": false
                    },
                    {
                        "name": "RemainingQTY",
                        "deviceType": "Integer",
                        "dataType": "Integer",
                        "isArray": false
                    },
                    {
                        "name": "RemainingTime",
                        "deviceType": "Integer",
                        "dataType": "Integer",
                        "isArray": false
                    },
                    {
                        "name": "RemainingBoard",
                        "deviceType": "Integer",
                        "dataType": "Integer",
                        "isArray": false
                    },
                    {
                        "name": "PartsOut",
                        "deviceType": "Integer",
                        "dataType": "Integer",
                        "isArray": false
                    }
                ]
            },
            "isReadable": true, "isWritable": true
        }
    ]
}

Unregister Event#

Notifies the protocol driver to stop raising the occurrences of a specific message when it occurs.

void connect.iot.driver.fujinexim.unregisterEvent(data: Event)

Example#

Notify connect.iot.driver.fujinexim.unregisterEvent

{
  "name": "EventName"
}

Execute Command#

Executes a custom command.

any connect.iot.driver.fujinexim.executeCommand(data: ExecuteCommand)

Example#

SendRequest connect.iot.driver.fujinexim.executeCommand

{
    "command": {
        "name": "StartEv",
        "deviceId": "STARTEV",
        "extendedData": {
            "executionMode": "SendRequest",
            "destination": "TargetDevice"
        },
        "parameters": [{
            "name": "machineName",
            "deviceId": "MachineName",
            "dataType": "String",
            "deviceType": "String" ,
            "extendedData": {}
        }],
    },
    "parameters": {
        "machineName": "Machine001",
    }
}