{ "info": { "author": "Advantech/MA", "author_email": "michelle.tsai@advantech.com.tw", "bugtrack_url": null, "classifiers": [], "description": "# AcmP SDK\nThis SDK package allows developers to esaily use Advantech AdvMot api.\n\n# Installation\nThis SDK supports Python version 3.10 or later\n```shell\n$ pip install -i pip install -i https://test.pypi.org/simple/ AcmP\n```\nBefore using this package, please ensure the following items are already installed:\n## Linux\n1. PCIE-1203M.ko\n2. libadvmot.so\n3. libpcie1203.so\n\nYou can check the installation using the following commands.\n```shell\n$ lsmod | grep PCI\n$ ls /lib | grep adv\n$ ls /lib | grep pci\n```\n## Windows\n1. PCIE1203Ms.sys\n2. ADVMOT.dll\n3. PCIE1203M.dll\n\nYou can check the installation using the following commands.\n```shell\nls C:\\Windows\\System32\\ | findstr ADVMOT\nls C:\\Windows\\System32\\ | findstr PCIE1203\n```\n# Available Devices\n* Advantech PCIE-1203\n# API\n## How to use?\nDue to our driver running with admin/root authentication, it's important to execute the project with admin/root privileges.\n\n### AdvCmnAPI_CM2\n* Device\n + Acm2_DevOpen\n + Acm2_DevInitialize\n + Acm2_GetAvailableDevs\n + Acm2_DevExportMappingTable\n + Acm2_DevImportMappingTable\n + Acm2_DevSaveAllMapFile\n + Acm2_DevLoadAllMapFile\n + Acm2_GetMappedLogicalIDList\n + Acm2_GetMappedObjInfo\n + Acm2_DevAllClose\n + Acm2_GetLastError\n + Acm2_GetMappedPhysicalID\n + Acm2_SetProperty\n + Acm2_GetProperty\n + Acm2_SetMultiProperty\n + Acm2_GetMultiProperty\n + Acm2_GetRawProperty\n + Acm2_EnableCallBackFuncForOneEvent\n + Acm2_DevLoadAllConfig\n + Acm2_DevLoadConfig\n + Acm2_DevReadMailBox\n + Acm2_DevWriteMailBox\n + Acm2_GetErrors\n + Acm2_ResetErrorRecord\n + Acm2_DevPreviewMotion\n* Axis\n + Acm2_AxReturnPausePosition\n + Acm2_AxSetSvOn\n + Acm2_DevSetAllSvOn\n + Acm2_AxSetErcOn\n + Acm2_AxResetAlm\n + Acm2_AxPTP\n + Acm2_AxMoveContinue\n + Acm2_AxMotionStop\n + Acm2_AxHome\n + Acm2_AxMoveGantryHome\n + Acm2_AxSetHomeSpeedProfile\n + Acm2_AxChangePos\n + Acm2_AxChangeVel\n + Acm2_AxChangeVelByRate\n + Acm2_AxMoveImpose\n + Acm2_AxResetError\n + Acm2_DevResetAllError\n + Acm2_AxGetState\n + Acm2_AxGetMotionIO\n + Acm2_AxSetPosition\n + Acm2_AxGetPosition\n + Acm2_AxSetSpeedProfile\n + Acm2_AxGetVel\n + Acm2_AxEnableExternalMode\n + Acm2_AxSoftJog\n + Acm2_AxSetJogSpeedProfile\n + Acm2_AxMotionStart\n + Acm2_AxPause\n + Acm2_AxResume\n + Acm2_AxResetPVTTable\n + Acm2_AxLoadPVTTable\n + Acm2_AxLoadPVTTableContinuous\n + Acm2_AxMovePVT\n + Acm2_AxCheckPTBuffer\n + Acm2_AxAddPTData\n + Acm2_AxMovePT\n + Acm2_AxResetPTData\n + Acm2_AxGearIn\n + Acm2_AxGantryIn\n + Acm2_AxPhaseAx\n + Acm2_AxSyncOut\n* Group\n + Acm2_GpGetPausePosition\n + Acm2_GpCreate\n + Acm2_GpGetAxesInGroup\n + Acm2_GpResetError\n + Acm2_GpLine\n + Acm2_GpArc_Center\n + Acm2_GpArc_3P\n + Acm2_GpArc_Angle\n + Acm2_Gp3DArc_Center\n + Acm2_Gp3DArc_NormVec\n + Acm2_Gp3DArc_3P\n + Acm2_Gp3DArc_3PAngle\n + Acm2_GpHelix_Center\n + Acm2_GpHelix_3P\n + Acm2_GpHelix_Angle\n + Acm2_GpResume\n + Acm2_GpPause\n + Acm2_GpMotionStop\n + Acm2_GpChangeVel\n + Acm2_GpChangeVelByRate\n + Acm2_GpGetVel\n + Acm2_GpSetSpeedProfile\n + Acm2_GpGetState\n + Acm2_GpLoadPath\n + Acm2_GpAddPath\n + Acm2_GpMovePath\n + Acm2_GpResetPath\n + Acm2_GpGetPathStatus\n + Acm2_GpMoveSelPath\n + Acm2_GpGetPathIndexStatus\n + Acm2_GpDelay\n + Acm2_GpPathDO\n + Acm2_GpPathWaitDI\n + Acm2_GpPathWaitForAxis\n + Acm2_GpLookAheadPath\n + Acm2_GpLookAheadPathFile\n \n* DIO\n + Acm2_ChSetDOBit\n + Acm2_ChGetDOBit\n + Acm2_ChGetDIBit\n + Acm2_ChSetDOBitByRingNo\n + Acm2_ChGetDOBitByRingNo\n + Acm2_ChGetDIBitByRingNo\n + Acm2_ChSetDOByte\n + Acm2_ChGetDOByte\n + Acm2_ChGetDIByte\n + Acm2_ChSetDOByteByRingNo\n + Acm2_ChGetDOByteByRingNo\n + Acm2_ChGetDIByteByRingNo\n* AIO\n + Acm2_ChSetAOData\n + Acm2_ChGetAOData\n + Acm2_ChSetAODataByRingNo\n + Acm2_ChGetAODataByRingNo\n + Acm2_ChGetAIData\n + Acm2_ChGetAIDataByRingNo\n + Acm2_ChGetCntData\n + Acm2_ChSetCntData\n + Acm2_ChLinkCmpFIFO\n + Acm2_ChLinkCmpObject\n + Acm2_ChGetLinkedCmpObject\n + Acm2_ChEnableCmp\n + Acm2_ChSetCmpOut\n + Acm2_ChSetCmpDoOut\n + Acm2_AxGetCmpData\n + Acm2_ChGetCmpData\n + Acm2_AxSetCmpTable\n + Acm2_AxSetCmpAuto\n + Acm2_ChSetCmpAuto\n + Acm2_ChSetCmpBufferData\n + Acm2_ChSetMultiCmpTable\n + Acm2_ChSetMultiCmpBufferData\n + Acm2_ChResetCmpData\n + Acm2_ChGetCmpBufferStatus\n + Acm2_ChLinkLatchAxis\n + Acm2_ChLinkLatchObject\n + Acm2_ChGetLinkedLatchObject\n + Acm2_ChTriggerLatch\n + Acm2_AxReadLatchBuffer\n + Acm2_ChReadLatchBuffer\n + Acm2_AxGetLatchBufferStatus\n + Acm2_ChGetLatchBufferStatus\n + Acm2_AxResetLatchBuffer\n + Acm2_ChResetLatchBuffer\n + Acm2_ChLinkPWMTable\n + Acm2_ChGetLinkedPWMTable\n + Acm2_ChSetPWMTable\n + Acm2_ChLoadPWMTableFile\n + Acm2_ChGetPWMTableStatus\n + Acm2_ChGetExtDriveData\n + Acm2_ChSetExtDriveData\n + Acm2_ChLinkExtDriveObject\n + Acm2_ChGetLinkedExtDriveObject\n + Acm2_DevMDaqConfig\n + Acm2_DevMDaqGetConfig\n + Acm2_DevMDaqStart\n + Acm2_DevMDaqStop\n + Acm2_DevMDaqReset\n + Acm2_DevMDaqGetStatus\n + Acm2_DevMDaqGetData\n + Acm2_GetDSPFrmWareDwnLoadRate\n* EtherCAT\n + Acm2_DevLoadENI\n + Acm2_DevConnect\n + Acm2_DevDisConnect\n + Acm2_DevGetSubDevicesID\n + Acm2_DevGetMDeviceInfo\n + Acm2_DevGetSubDeviceInfo\n + Acm2_DevGetSubDeviceFwVersion\n + Acm2_DevSetSubDeviceID\n + Acm2_DevSetSubDeviceStates\n + Acm2_DevGetSubDeviceStates\n + Acm2_DevWriteSDO\n + Acm2_DevReadSDO\n + Acm2_DevWritePDO\n + Acm2_DevReadPDO\n + Acm2_DevWriteReg\n + Acm2_DevReadReg\n + Acm2_DevReadSubDeviceCommErrCnt\n + Acm2_Ax1DCompensateTable\n + Acm2_Ax2DCompensateTable\n + Acm2_AxZAxisCompensateTable\n + Acm2_AxGetCompensatePosition\n + Acm2_DevOscChannelDataStart\n + Acm2_DevOscChannelDataStop\n + Acm2_DevGetOscChannelDataConfig\n + Acm2_DevSetOscChannelDataConfig\n + Acm2_DevGetOscChannelData\n + Acm2_DevGetOscChannelStatus\n----\n\n\n### Acm2_GetAvailableDevs\nGet all device list.\n\n```cpp\nU32 Acm2_GetAvailableDevs(DEVLIST *DeviceList, U32 MaxEntries, PU32 OutEntries)\n```\n\n\n#### Acm2_DevOpen\nOpen device with device number.\n\n```cpp\nU32 Acm2_DevOpen(U32 DeviceNumber, DEVICEINFO *DeviceHandle)\n```\n\n\n#### Acm2_DevExportMappingTable\nExport mapping table of device.\n\n```cpp\nU32 Acm2_DevExportMappingTable(PI8 FilePath)\n```\n\n\n#### Acm2_DevImportMappingTable\nImport mapping table of device.\n\n```cpp\nU32 Acm2_DevImportMappingTable(PI8 FilePath)\n```\n\n\n#### Acm2_DevSaveAllMapFile\nUpload input/output mapping table from device.\n\n```cpp\nU32 Acm2_DevSaveAllMapFile(PI8 FilePath)\n```\n\n\n#### Acm2_DevLoadAllMapFile\nDownload input/output mapping table to device.\n\n```cpp\nU32 Acm2_DevLoadAllMapFile(PI8 FilePath)\n```\n\n\n#### Acm2_GetMappedPhysicalID\nGet mapped physical id of device.\n\n```cpp\nU32 Acm2_GetMappedPhysicalID(ADV_OBJ_TYPE ObjType, U32 ObjLogicalID, PU32 DeviceNumber, PU32 ObjPhysicalID)\n```\n\n\n#### Acm2_GetMappedLogicalIDList\nGet mapped list of logical id.\n\n```cpp\nU32 Acm2_GetMappedLogicalIDList(ADV_OBJ_TYPE ObjType, U32 DeviceLogicalID, PU32 LogicallIDList, PU32 ObjCnt)\n```\n\n\n#### Acm2_GetMappedObjInfo\nGet mapped object information.\n\n```cpp\nU32 Acm2_GetMappedObjInfo(ADV_OBJ_TYPE ObjType, U32 ObjLogicalID, OUT VOID *pObjInfo)\n```\n\n\n#### Acm2_DevAllClose\nClose all device at same time.\n\n```cpp\nU32 Acm2_DevAllClose()\n```\n```python\n# Example code\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import DEVLIST\nfrom AcmP.MotionInfo import DEVICEINFO\n\nnumber_hex = '0x63000000'\nnumber_int = int(number_hex, 16)\ndevice_number = c_uint32(number_int)\ndev_list = (DEVLIST*10)()\ndevice_info = DEVICEINFO()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Then open\nerrCde = AdvMot.Acm2_DevOpen(device_number, byref(device_info))\n# Close device\nerrCde = AdvMot.Acm2_DevAllClose()\n```\n\n\n#### Acm2_DevInitialize\nInitial the device.\n\n```cpp\nU32 Acm2_DevInitialize()\n```\n\n\n#### Acm2_AxGetPosition\nGet axis position by axis number, and position type.\n\n```cpp\nU32 Acm2_AxGetPosition(U32 AxID, POSITION_TYPE PosType, PF64 Position)\n```\n```python\n# Example code\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import DEVLIST\nfrom AcmP.AdvMotDrv import POSITION_TYPE\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\naxid = c_uint32(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\npos = c_double(0)\n# Get axis 0 command position\nerrCde = AdvMot.Acm2_AxGetPosition(axid, pos_type, byref(pos))\n```\n\n\n#### Acm2_AxPTP\nSet axis move with position.\n\n```cpp\nU32 Acm2_AxPTP(U32 AxID, ABS_MODE ptpMode, F64 Distance)\n```\n\n\n#### Acm2_AxGetState\nGet axis state.\n\n```cpp\nU32 Acm2_AxGetState(U32 AxID, AXIS_STATUS_TYPE StatusType, PU32 State)\n```\n```python\n# Example code\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import DEVLIST\nfrom AcmP.AdvMotDrv import POSITION_TYPE, ABS_MODE, AXIS_STATUS_TYPE\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\naxid = c_uint32(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\npos = c_double(0)\ndistance = c_double(1000)\nabs_mode = c_uint(ABS_MODE.MOVE_REL.value)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nstate = c_uint32(16)\n# Get axis 0 command position\nerrCde = AdvMot.Acm2_AxGetPosition(axid, pos_type, byref(pos))\n# Move axis 0 to position 1000(command position)\nerrCde = AdvMot.Acm2_AxPTP(axid, abs_mode, distance)\n# Check axis 0 status\nerrCde = AdvMot.Acm2_AxGetState(axid, state_type, byref(state))\n```\n\n\n#### Acm2_SetProperty\nSet device/axis property.\n\n```cpp\nU32 Acm2_SetProperty(U32 ObjID, U32 PropertyID, F64 Value)\n```\n\n\n#### Acm2_GetProperty\nGet device/axis property.\n\n```cpp\nU32 Acm2_GetProperty(U32 ObjID, U32 PropertyID, PF64 Value)\n```\n```python\n# Example code\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import DEVLIST\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\ndo_ch = c_uint32(0)\nproperty_id = c_uint(PropertyID2.CFG_CH_DaqDoFuncSelect.value)\nval = c_double(1)\n# Set local DO channel 0 as gerneral DO\nerrCde = AdvMot.Acm2_SetProperty(do_ch, property_id, val)\nget_val = c_double(0)\n# Get local DO channel 0 property value\nerrCde = AdvMot.Acm2_GetProperty(do_ch, property_id, byref(get_val))\n```\n\n\n#### Acm2_SetMultiProperty\nSet multiple properties at once.\n\n```cpp\nU32 Acm2_SetMultiProperty(U32 ObjID, PU32 PropertyID, PF64 Value, U32 Data_Cnt, PU32 ErrorBuffer)\n```\n\n\n#### Acm2_GetMultiProperty\nGet multiple properties at once.\n\n```cpp\nU32 Acm2_GetMultiProperty(U32 ObjID, PU32 PropertyID, PF64 Value, U32 Data_Cnt, PU32 ErrorBuffer)\n```\n```python\n# Example code\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import DEVLIST\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n# Set axis 0 speed info at once\nax_id = c_uint32(0)\nproperty_arr = [c_uint32(PropertyID2.PAR_AxVelLow.value), c_uint32(PropertyID2.PAR_AxVelHigh.value)]\ntrans_ppt_arr = (c_uint32 * len(property_arr))(*property_arr)\n# Default value of velocity low is 2000, and velocity high is 8000.\nvalue_arr = [c_double(1000), c_double(2000)]\ntrans_val_arr = (c_double * len(value_arr))(*value_arr)\ndata_cnt = c_uint32(2)\nerr_buffer = (c_uint32 * data_cnt.value)()\n# Set value\nerrCde = AdvMot.Acm2_SetMultiProperty(ax_id, trans_ppt_arr, trans_val_arr, data_cnt, err_buffer)\n# Check value\nget_val = (c_double * data_cnt.value)()\nerrCde = AdvMot.Acm2_GetMultiProperty(ax_id, trans_ppt_arr, get_val, data_cnt, err_buffer)\nfor i in range(data_cnt.value):\n print('set[{0}]:{1}, get:{2}'.format(i, value_arr[i].value, get_val[i]))\n```\n\n\n#### Acm2_GetRawProperty\nGet raw property value.\n\n```cpp\nU32 Acm2_GetRawProperty(U32 ObjID, U32 PropertyID, PVOID Value, PU32 BufferLength)\n```\n\n\n#### Acm2_EnableCallBackFuncForOneEvent\nSet callback function for event.\n\n```cpp\nU32 Acm2_EnableCallBackFuncForOneEvent(U32 ObjID, ADV_EVENT_SUBSCRIBE EventID, ADV_USER_CALLBACK_FUNC CallBackFun)\n```\n```python\nimport time\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import DEVLIST\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\n@CFUNCTYPE(c_uint32, c_uint32, c_void_p)\ndef EvtAxMotionDone(axid, reservedParam):\n ax_motion_cnt.value = ax_motion_cnt.value + 1;\n print('[EvtAxMotionDone] AX:{0}, counter:{1}'.format(axid, ax_motion_cnt.value))\n return 0;\n\n@CFUNCTYPE(c_uint32, c_uint32, c_void_p)\ndef EmptyFunction(val, res):\n return 0;\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\nax_id = c_uint32(0)\nabs_mode = c_uint(ABS_MODE.MOVE_REL.value)\ndistance = c_double(1000)\nax_motion_cnt.value = 0\n# Set callback function, enable event\nerrCde = AdvMot.Acm2_EnableCallBackFuncForOneEvent(ax_id, c_int(ADV_EVENT_SUBSCRIBE.AXIS_MOTION_DONE.value), EvtAxMotionDone)\n# Move\nfor i in range(2):\n errCde = AdvMot.Acm2_AxPTP(ax_id, abs_mode, distance)\n # Check status\n state = c_uint32(0)\n state_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n while (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\ntime.sleep(1)\nprint('AX:{0} is done, event cnt is:{1}'.format(ax_id.value, ax_motion_cnt.value))\n# Remove callback function, disable event\nerrCde = AdvMot.Acm2_EnableCallBackFuncForOneEvent(ax_id, c_int(ADV_EVENT_SUBSCRIBE.EVENT_DISABLE.value), EmptyFunction)\n```\n\n\n\n#### Acm2_DevLoadAllConfig\nLoad all configuration at once.\n\n```cpp\nU32 Acm2_DevLoadAllConfig(PI8 ConfigPath)\n```\n\n\n#### Acm2_DevLoadConfig\nLoad configuration.\n\n```cpp\nU32 Acm2_DevLoadConfig(U32 DevID, PI8 ConfigPath)\n```\n\n\n#### Acm2_DevReadMailBox\nRead mailbox of device.\n\n```cpp\nU32 Acm2_DevReadMailBox(ADV_OBJ_TYPE ObjType, U32 ObjID, U32 par_id, U32 data_index, U32 data_count, PU32 DataBuffer)\n```\n\n\n#### Acm2_DevWriteMailBox\nWrite mailbox of device.\n\n```cpp\nU32 Acm2_DevWriteMailBox(ADV_OBJ_TYPE ObjType, U32 ObjID, U32 par_id, U32 data_index, U32 data_count, PU32 DataBuffer)\n```\n\n\n#### Acm2_GetErrors\nGet error of device.\n\n```cpp\nU32 Acm2_GetErrors(U32 DevID, PVOID Error, PU32 ErrorCount)\n```\n\n\n#### Acm2_ResetErrorRecord\nReset error.\n\n```cpp\nU32 Acm2_ResetErrorRecord(U32 DevID)\n```\n\n\n#### Acm2_DevPreviewMotion\nPreview motion.\n\n```cpp\nU32 Acm2_DevPreviewMotion(U32 DevID, PI8 InputFile, PI8 OutputFile, U16 NumberOfAxes)\n```\n\n\n#### Acm2_ChSetDOBit\nSet DO bit by channel.\n\n```cpp\nU32 Acm2_ChSetDOBit(U32 DoChannel, U32 BitData)\n```\n```python\n# Example code\n# Using the example code after LoadENI & Connect\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import DEVLIST\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\n# Set DO channel, local DO on PCIE-1203 is 0~1, rest of device will set from channel 8~\ndo_channel8 = c_uint32(8)\ndo_channel14 = c_uint32(14)\nbit_data = c_uint32(DO_ONOFF.DO_ON.value)\n# Set DO(8) on\nerrCde = AdvMot.Acm2_ChSetDOBit(do_channel8, bit_data)\n# Set DO(14) on\nerrCde = AdvMot.Acm2_ChSetDOBit(do_channel14, bit_data)\ntime.sleep(0.5)\nget_data8 = c_uint32(0)\nget_data14 = c_uint32(0)\n# Get DO(8) value\nerrCde = AdvMot.Acm2_ChGetDOBit(do_channel8, byref(get_data8))\n# Get DO(14) value\nerrCde = AdvMot.Acm2_ChGetDOBit(do_channel8, byref(get_data14))\n```\n\n\n#### Acm2_ChGetDOBit\nGet DO bit by channel.\n\n```cpp\nU32 Acm2_ChGetDOBit(U32 DoChannel, PU32 BitData)\n```\n```python\n# Example code\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import DEVLIST\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ndo_ch = c_uint32(0)\nproperty_id = c_uint(PropertyID2.CFG_CH_DaqDoFuncSelect.value)\nval = c_double(1)\n# Set local DO channel 0 as gerneral DO\nerrCde = AdvMot.Acm2_SetProperty(do_ch, property_id, val)\nget_val = c_double(0)\n# Get local DO channel 0 property value\nerrCde = AdvMot.Acm2_GetProperty(do_ch, property_id, byref(get_val))\n# Set local DO channel 0 ON\ndata = c_uint32(1)\nerrCde = AdvMot.Acm2_ChSetDOBit(do_ch, data)\n# Get local DO channel 0 value\nget_data = c_uint32(0)\nerrCde = AdvMot.Acm2_ChGetDOBit(do_ch, byref(get_data))\n```\n\n\n#### Acm2_GetLastError\nGet last error of system.\n\n```cpp\nU32 Acm2_GetLastError(ADV_OBJ_TYPE ObjType, U32 ObjLogicalID)\n```\n\n\n#### Acm2_AxReturnPausePosition\nGet axis pause position.\n\n```cpp\nU32 Acm2_AxReturnPausePosition(U32 AxID)\n```\n\n\n#### Acm2_AxSetSvOn\nSet axis servo on/off.\n\n```cpp\nU32 Acm2_AxSetSvOn(U32 AxID, DO_ONOFF OnOff)\n```\n\n\n#### Acm2_DevSetAllSvOn\nSet all axes servo on.off.\n\n```cpp\nU32 Acm2_DevSetAllSvOn(DO_ONOFF OnOff)\n```\n\n\n#### Acm2_AxSetErcOn\nSet axis erc on/off.\n\n```cpp\nU32 Acm2_AxSetErcOn(U32 AxID, DO_ONOFF OnOff)\n```\n\n\n#### Acm2_AxResetAlm\nReset axis alarm logic.\n\n```cpp\nU32 Acm2_AxResetAlm(U32 AxID, DO_ONOFF OnOff)\n```\n\n\n#### Acm2_AxMoveContinue\nSet aixs continue move.\n\n```cpp\nU32 Acm2_AxMoveContinue(U32 AxID, MOTION_DIRECTION Direction)\n```\n\n\n#### Acm2_AxMotionStop\nForce axis stop motion.\n\n```cpp\nU32 Acm2_AxMotionStop(PU32 AxisArray, U32 ArrayElements, MOTION_STOP_MODE StopMode, F64 NewDec)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\nax_id = c_uint32(0)\nmove_dir = c_uint(MOTION_DIRECTION.DIRECTION_POS.value)\nerrCde = AdvMot.Acm2_AxMoveContinue(ax_id, move_dir)\ntime.sleep(2)\nax_arr = [c_uint32(0)]\naxArr = (c_uint32 * len(ax_arr))(*ax_arr)\nstop_mode = c_uint(MOTION_STOP_MODE.MOTION_STOP_MODE_DEC.value)\nnew_dec = c_double(3000)\nerrCde = AdvMot.Acm2_AxMotionStop(axArr, len(ax_arr), stop_mode, new_dec)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis position\nstarting_pos = c_double(0)\npos = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\nerrCde = AdvMot.Acm2_AxGetPosition(ax_id, pos_type, byref(pos))\n```\n\n\n#### Acm2_AxHome\nSet axis moving home with direction and home mode.\n\n```cpp\nU32 Acm2_AxHomeEx(U32 AxID, U32 DirMode)\n```\n\n\n#### Acm2_AxMoveGantryHome\nSet axis moving home with gantry.\n\n```cpp\nU32 Acm2_AxMoveGantryHome(U32 AxID, HOME_MODE HomeMode, MOTION_DIRECTION Direction)\n```\n\n\n#### Acm2_AxSetHomeSpeedProfile\nSet axis home speed config.\n\n```cpp\nU32 Acm2_AxSetHomeSpeedProfile(U32 AxID, SPEED_PROFILE_PRM ProfileVel)\n```\n\n\n#### Acm2_AxChangePos\nSet axis position.\n\n```cpp\nU32 Acm2_AxChangePos(U32 AxID, F64 NewPosition)\n```\n\n\n#### Acm2_AxChangeVel\nSet axis velocity.\n\n```cpp\nU32 Acm2_AxChangeVel(U32 AxID, F64 NewVelocity, F64 NewAcc, F64 NewDec)\n```\n\n\n#### Acm2_AxChangeVelByRate\nSet axis velocity by rate.\n\n```cpp\nU32 Acm2_AxChangeVelByRate(U32 AxID, U32 Rate, F64 NewAcc, F64 NewDec)\n```\n\n\n#### Acm2_AxMoveImpose\nSet axis impose.\n\n```cpp\nU32 Acm2_AxMoveImpose(U32 AxID, F64 Position, F64 NewVelocity)\n```\n\n\n#### Acm2_AxResetError\nReset error of axis.\n\n```cpp\nU32 Acm2_AxResetError(U32 AxID)\n```\n\n\n#### Acm2_DevResetAllError\nReset all device error.\n\n```cpp\nU32 Acm2_DevResetAllError()\n```\n```python\n# Example code\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import DEVLIST\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n# Clear all error\nerrCde = AdvMot.Acm2_DevResetAllError()\n\nax_id = c_uint32(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\npos = c_double(0)\n# Set axis 0 command position as 0\nerrCde = AdvMot.Acm2_AxSetPosition(ax_id, pos_type, pos)\n```\n\n\n#### Acm2_AxGetMotionIO\nGet axis motion IO status.\n\n```cpp\nU32 Acm2_AxGetMotionIO(U32 AxID, MOTION_IO *Status)\n```\n\n\n#### Acm2_AxSetPosition\nSet axis position.\n\n```cpp\nU32 Acm2_AxSetPosition(U32 AxID, POSITION_TYPE PosType, F64 Position)\n```\n\n\n#### Acm2_AxSetSpeedProfile\nSet axis speed information.\n\n```cpp\nU32 Acm2_AxSetSpeedProfile(U32 AxID, SPEED_PROFILE_PRM ProfileVel)\n```\n```python\n# Example code\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\nax_id = c_uint32(0)\nspeed_info = SPEED_PROFILE_PRM()\nspeed_info.FH = c_double(3000)\nspeed_info.FL = c_double(1500)\nspeed_info.Acc = c_double(11000)\nspeed_info.Dec = c_double(9900)\nspeed_info.JerkFac = c_double(0)\n# Set speed information\nerrCde = AdvMot.Acm2_AxSetSpeedProfile(ax_id, speed_info)\n```\n\n\n#### Acm2_AxGetVel\nGet axis current velocity.\n\n```cpp\nU32 Acm2_AxGetVel(U32 AxID, VELOCITY_TYPE VelType, PF64 Velocity)\n```\n```python\n# Example code\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\nfrom AcmP.AdvMotDrv import VELOCITY_TYPE\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\nax_id = c_uint32(0)\nget_vel = c_double(0)\nvel_Type = c_uint(VELOCITY_TYPE.VELOCITY_CMD.value)\n# Get axis 0 current velocity\nerrCde = AdvMot.Acm2_AxGetVel(ax_id, vel_Type, byref(get_vel))\n```\n\n\n#### Acm2_AxEnableExternalMode\nEnable axis external mode.\n\n```cpp\nU32 Acm2_AxEnableExternalMode(U32 AxID, EXT_DRIVE_MODE ExtDrvMode)\n```\n\n\n#### Acm2_AxSoftJog\nSet axis jog.\n\n```cpp\nU32 Acm2_AxSoftJog(U32 AxID, MOTION_DIRECTION Direction)\n```\n\n\n#### Acm2_AxSetJogSpeedProfile\nSet axis jog speed information.\n\n```cpp\nU32 Acm2_AxSetJogSpeedProfile(U32 AxID, JOG_SPEED_PROFILE_PRM ProfileVel)\n```\n```python\n# Example code\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\nax_id = c_uint32(0)\njog_speed_info = JOG_SPEED_PROFILE_PRM()\njog_speed_info.FH = c_double(8000)\njog_speed_info.FL = c_double(1000)\njog_speed_info.Acc = c_double(10000)\njog_speed_info.Dec = c_double(5000)\njog_speed_info.VLTime = c_double(2000)\n# Set axis 0 jog speed information\nerrCde = AdvMot.Acm2_AxSetJogSpeedProfile(ax_id, jog_speed_info)\n```\n\n\n#### Acm2_AxMotionStart\nStart motion.\n\n```cpp\nU32 Acm2_AxMotionStart(PU32 AxisArray, U32 ArrayElements)\n```\n\n\n#### Acm2_AxPause\nPause motion.\n\n```cpp\nU32 Acm2_AxPause(U32 AxID)\n```\n\n\n#### Acm2_AxResume\nResume motion.\n\n```cpp\nU32 Acm2_AxResume(U32 AxID)\n```\n\n\n#### Acm2_AxResetPVTTable\nReset axis PVT table.\n\n```cpp\nU32 Acm2_AxResetPVTTable(U32 AxID)\n```\n\n\n#### Acm2_AxLoadPVTTable\nLoad axis PVT table.\n\n```cpp\nU32 Acm2_AxLoadPVTTable(U32 AxID, PF64 Position, PF64 Velocity, PF64 Time, U32 ArrayElements)\n```\n\n\n#### Acm2_AxLoadPVTTableContinuous\nContinuous loading PVT table.\n\n```cpp\nU32 Acm2_AxLoadPVTTableContinuous(U32 AxID, PF64 Position, PF64 Velocity, PF64 JerkFactor, PF64 MaxVel, PF64 Acc, PF64 Dec, F64 TimeDelay, U32 ArrayElements)\n```\n\n\n#### Acm2_AxMovePVT\nMove PVT motion.\n\n```cpp\nU32 Acm2_AxMovePVT(U32 AxID)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\nax_id = c_uint32(0)\n# Reset PVT table\nerrCde = AdvMot.Acm2_AxResetPVTTable(ax_id)\n''' PVT table\n|Position|Vel |Time|\n|--------|----|----|\n|0 |0 |0 |\n|5000 |4000|2000|\n|15000 |5000|3000|\n|30000 |8000|4000|\n'''\npos_arr = [c_double(0), c_double(5000), c_double(15000), c_double(30000)]\nposArr = (c_double * len(pos_arr))(*pos_arr)\nvel_arr = [c_double(0), c_double(4000), c_double(5000), c_double(8000)]\nvelArr = (c_double * len(vel_arr))(*vel_arr)\ntime_arr = [c_double(0), c_double(2000), c_double(3000), c_double(4000)]\ntimeArr = (c_double * len(time_arr))(*time_arr)\n# Set table of PVT\nerrCde = AdvMot.Acm2_AxLoadPVTTable(ax_id, posArr, velArr, timeArr, len(pos_arr))\n# Set PVT\nerrCde = AdvMot.Acm2_AxMovePVT(ax_id)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\nget_pos = c_double(0)\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\n# Get axis 0 state\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Check axis 0 is ready\nif (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(ax_id, pos_type, byref(get_pos))\n```\n\n\n#### Acm2_AxCheckPTBuffer\nCheck axis PT buffer.\n\n```cpp\nU32 Acm2_AxCheckPTBuffer(U32 AxID, PU32 Freespace)\n```\n\n\n#### Acm2_AxAddPTData\nAdd axis PT data.\n\n```cpp\nU32 Acm2_AxAddPTData(U32 AxID, F64 Position, F64 Time)\n```\n\n\n#### Acm2_AxMovePT\nMove PT motion.\n\n```cpp\nU32 Acm2_AxMovePT(U32 AxID)\n```\n\n\n#### Acm2_AxResetPTData\nReset axis PT data.\n\n```cpp\nU32 Acm2_AxResetPTData(U32 AxID)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\nax_id = c_uint32(0)\n# Reset PT table\nerrCde = AdvMot.Acm2_AxResetPTData(ax_id)\n''' PT table\n|Position|Time|\n|--------|----|\n|0 |0 |\n|5000 |2000|\n|15000 |3000|\n|30000 |5000|\n'''\npos_arr = [c_double(0), c_double(5000), c_double(15000), c_double(30000)]\ntime_arr = [c_double(0), c_double(2000), c_double(3000), c_double(5000)]\n# Set PT table\nfor i in range(len(pos_arr)):\n errCde = AdvMot.Acm2_AxAddPTData(ax_id, pos_arr[i], time_arr[i])\n# Start move PT table\nerrCde = AdvMot.Acm2_AxMovePT(ax_id)\n\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\nget_pos = c_double(0)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(ax_id, pos_type, byref(get_pos))\n```\n\n\n#### Acm2_AxGearIn\nSet axis gear.\n\n```cpp\nU32 Acm2_AxGearIn(U32 PrimaryAxisID, U32 FollowingAxisID, GEAR_IN_PRM GearInParameter)\n```\n\n\n#### Acm2_AxGantryIn\nSet axis gantry.\n\n```cpp\nU32\tAcm2_AxGantryIn(U32\tPrimaryAxisID, U32 FollowingAxisID, GANTRY_IN_PRM GantryInParameter)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\nprimary_ax = c_uint32(0)\nfollow_ax = c_uint32(1)\n# Reset following axis\nerrCde = AdvMot.Acm2_AxSyncOut(follow_ax)\n# Set gantry parameter\ngantry_param = GANTRY_IN_PRM()\n# Set gantry reference source as command position\ngantry_param.RefSrc = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Set gantry direction as positive\ngantry_param.Direction = c_uint(MOTION_DIRECTION.DIRECTION_POS.value)\n# Set gantry\nerrCde = AdvMot.Acm2_AxGantryIn(primary_ax, follow_ax, gantry_param)\n# Move primary axis\nabs_mode = c_uint(ABS_MODE.MOVE_REL.value)\ndistance = c_double(10000)\nerrCde = AdvMot.Acm2_AxPTP(primary_ax, abs_mode, distance)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 (primary) position\nerrCde = AdvMot.Acm2_AxGetPosition(primary_ax, pos_type, byref(get_pos_0))\n# Get axis 1 (following) position\nerrCde = AdvMot.Acm2_AxGetPosition(follow_ax, pos_type, byref(get_pos_1))\n# Reset following axis\nerrCde = AdvMot.Acm2_AxSyncOut(follow_ax)\n```\n\n\n#### Acm2_AxPhaseAx\nSet axis phase.\n\n```cpp\nU32 Acm2_AxPhaseAx(U32 AxID, PHASE_AXIS_PRM PhaseAxParameter)\n```\n\n\n#### Acm2_AxSyncOut\nLift the gantry.\n\n```cpp\nU32 Acm2_AxSyncOut(U32 FollowingAxisID)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\nprimary_ax = c_uint32(0)\nfollow_ax = c_uint32(1)\n# Reset following axis\nerrCde = AdvMot.Acm2_AxSyncOut(follow_ax)\ngear_param = GEAR_IN_PRM()\n# Position type as command position\ngear_param.RefSrc = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Mode as relative mode\ngear_param.Mode = c_uint32(0)\n# Set gear ratio\ngear_param.GearPosition = c_double(0)\ngear_param.GearRatioRate.Num = c_double(1)\ngear_param.GearRatioRate.Den = c_double(1)\n# Set gear\nerrCde = AdvMot.Acm2_AxGearIn(primary_ax, follow_ax, gear_param)\n# Move primary axis\nabs_mode = c_uint(ABS_MODE.MOVE_REL.value)\ndistance = c_double(10000)\nerrCde = AdvMot.Acm2_AxPTP(primary_ax, abs_mode, distance)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 (primary) position\nerrCde = AdvMot.Acm2_AxGetPosition(primary_ax, pos_type, byref(get_pos_0))\n# Get axis 1 (following) position\nerrCde = AdvMot.Acm2_AxGetPosition(follow_ax, pos_type, byref(get_pos_1))\n# Reset following axis\nerrCde = AdvMot.Acm2_AxSyncOut(follow_ax)\n```\n\n\n#### Acm2_GpGetPausePosition\nGet group pause position.\n\n```cpp\nU32 Acm2_GpGetPausePosition(U32 GpID, PF64 PosArray)\n```\n\n\n#### Acm2_GpCreate\nCreate group.\n\n```cpp\nU32 Acm2_GpCreate(U32 GpID, PU32 AxisArray, U32 ArrayElements)\n```\n\n\n#### Acm2_GpGetAxesInGroup\nCheck axes in group.\n\n```cpp\nU32 Acm2_GpGetAxesInGroup(U32 GpID, PU32 AxisArray, PU32 ArrayElements)\n```\n\n\n#### Acm2_GpResetError\nReset error of group.\n\n```cpp\nU32 Acm2_GpResetError(U32 GpID)\n```\n\n\n#### Acm2_GpLine\nMove group in line.\n\n```cpp\nU32 Acm2_GpLine(U32 GpID, GP_LINE_MODE LineMode, PF64 EndArray, PU32 ArrayElements)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\n# Set group move as relative\ngp_move_mode = c_uint(GP_LINE_MODE.LINE_REL.value)\n# Set group end position: axis(0) = 10000, axis(1) = 10000\nend_pos_arr = [c_double(10000), c_double(10000)]\narr_element = c_uint32(len(end_pos_arr))\nend_arr = (c_double * len(end_pos_arr))(*end_pos_arr)\n# Group 0 move line\nerrCde = AdvMot.Acm2_GpLine(gp_id, gp_move_mode, end_arr, byref(arr_element))\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 (primary) position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 (following) position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_GpArc_Center\nSet group arc center.\n\n```cpp\nU32 Acm2_GpArc_Center(U32 GpID, ABS_MODE ArcMode, PF64 CenterArray, PF64 EndArray, PU32 pArrayElements, ARC_DIRECTION Direction)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\n# Set 2D Arc mode\narc_mode = c_uint(ABS_MODE.MOVE_REL.value)\n# Set 2D Arc CW center, end position\n'''\n| axis | Arc center | Arc end |\n|------|------------|---------|\n| 0 | 8000 | 16000 |\n| 1 | 0 | 0 |\n'''\ncenter_ax_arr = [c_double(8000), c_double(0)]\ncenter_arr = (c_double * len(center_ax_arr))(*center_ax_arr)\nend_ax_arr = [c_double(16000), c_double(0)]\nend_arr = (c_double * len(end_ax_arr))(*end_ax_arr)\narr_element = c_uint32(len(end_ax_arr))\ndir_mode = c_uint(ARC_DIRECTION.ARC_CW.value)\nerrCde = AdvMot.Acm2_GpArc_Center(gp_id, arc_mode, center_arr, end_arr, byref(arr_element), dir_mode)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_GpArc_3P\nSet group arc point.\n\n```cpp\nU32 Acm2_GpArc_3P(U32 GpID, ABS_MODE ArcMode, PF64 RefArray, PF64 EndArray, PU32 pArrayElements, ARC_DIRECTION Direction)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\n# # Set 2D Arc mode as relative, which the starting point of circular is (0, 0)\narc_mode = c_uint(ABS_MODE.MOVE_REL.value)\n# Set 2D Arc CW center, end position\n'''\n| axis | point 1 | end point |\n|------|---------|-----------|\n| 0(x) | 8000 | 16000 |\n| 1(y) | 8000 | 0 |\n'''\nref_arr = [c_double(8000), c_double(8000)]\nrefArr = (c_double * len(ref_arr))(*ref_arr)\nend_arr = [c_double(16000), c_double(0)]\nendArr = (c_double * len(end_arr))(*end_arr)\narr_element = c_uint32(len(ref_arr))\n# Set arc movement as CW\ndir_mode = c_uint(ARC_DIRECTION.ARC_CW.value)\nerrCde = AdvMot.Acm2_GpArc_3P(gp_id, arc_mode, refArr, endArr, byref(arr_element), dir_mode)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_GpArc_Angle\nSet group arc angle.\n\n```cpp\nU32 Acm2_GpArc_Angle(U32 GpID, ABS_MODE ArcMode, PF64 CenterArray, PU32 pArrayElements, F64 Degree, ARC_DIRECTION Direction)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\n# Set 2D Arc mode as relative, which the starting point of circular is (0, 0)\narc_mode = c_uint(ABS_MODE.MOVE_REL.value)\n# Set center as (20000, 20000)\ncenter_arr = [c_double(20000), c_double(20000)]\ncenterArr = (c_double * len(center_arr))(*center_arr)\narr_element = c_uint32(len(center_arr))\n# Set degree as 45\ndegree = c_double(45)\n# Set arc movement as CW\ndir_mode = c_uint(ARC_DIRECTION.ARC_CW.value)\nerrCde = AdvMot.Acm2_GpArc_Angle(gp_id, arc_mode, centerArr, byref(arr_element), degree, dir_mode)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_Gp3DArc_Center\nSet 3D group arc center.\n\n```cpp\nU32 Acm2_Gp3DArc_Center(U32 GpID, ABS_MODE ArcMode, PF64 CenterArray, PF64 EndArray, PU32 pArrayElements, ARC_DIRECTION Direction)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1), c_uint32(2)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1, 2 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\n# Set 3D Arc mode\narc_mode = c_uint(ABS_MODE.MOVE_REL.value)\n# Set 3D Arc CW, with 120 degree\n'''\n| axis | Arc center | Arc end |\n|------|------------|---------|\n| 0 | 20000 | 20000 |\n| 1 | 20000 | 40000 |\n| 2 | 0 | 20000 |\n'''\ncenter_ax_arr = [c_double(20000), c_double(20000), c_double(0)]\ncenter_arr = (c_double * len(center_ax_arr))(*center_ax_arr)\nend_ax_arr = [c_double(20000), c_double(40000), c_double(20000)]\nend_arr = (c_double * len(end_ax_arr))(*end_ax_arr)\narr_element = c_uint32(len(end_ax_arr))\ndir_mode = c_uint(ARC_DIRECTION.ARC_CW.value)\nerrCde = AdvMot.Acm2_Gp3DArc_Center(gp_id, arc_mode, center_arr, end_arr, byref(arr_element), dir_mode)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\nget_pos_2 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Get axis 2 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[2], pos_type, byref(get_pos_2))\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_Gp3DArc_NormVec\nSet 3D group arc norm vector.\n\n```cpp\nU32 Acm2_Gp3DArc_NormVec(U32 GpID, ABS_MODE ArcMode, PF64 CenterArray, PF64 NormalVec, PU32 pArrayElements, F64 Angle, ARC_DIRECTION Direction)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1), c_uint32(2)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1, 2 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\n# Set 3D Arc mode\narc_mode = c_uint(ABS_MODE.MOVE_REL.value)\n# Set direction as CW\ndir_mode = c_uint(ARC_DIRECTION.ARC_CW.value)\n# Set 3D Arc CW, with 120 degree\n'''\n| axis | Arc center | Arc end |\n|------|------------|---------|\n| 0 | 20000 | 20000 |\n| 1 | 20000 | 40000 |\n| 2 | 0 | 20000 |\n'''\ncenter_arr = [c_double(20000), c_double(20000), c_double(0)]\ncenterArr = (c_double * len(center_arr))(*center_arr)\nv1 = np.array([(0-center_arr[0].value), (0-center_arr[1].value), (0-center_arr[2].value)])\narc_end_arr = [c_double(20000), c_double(40000), c_double(20000)]\nv2 = np.array([(arc_end_arr[0].value-center_arr[0].value), (arc_end_arr[1].value-center_arr[1].value), (arc_end_arr[2].value-center_arr[2].value)])\ncross_product = np.cross(v1, v2)\nnormalize_cross = cross_product / (center_arr[0].value * center_arr[0].value)\nnorm_vec_arr = [c_double(normalize_cross[0]), c_double(normalize_cross[1]), c_double(normalize_cross[2])]\nnormVecArr = (c_double * len(norm_vec_arr))(*norm_vec_arr)\narr_element = c_uint32(len(center_arr))\nangle = c_double(120)\nerrCde = AdvMot.Acm2_Gp3DArc_NormVec(gp_id, arc_mode, centerArr, normVecArr, byref(arr_element), angle, dir_mode)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\nget_pos_2 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Get axis 2 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[2], pos_type, byref(get_pos_2))\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_Gp3DArc_3P\nSet arc movement with 3 points of circular.\n\n```cpp\nU32 Acm2_Gp3DArc_3P(U32 GpID, ABS_MODE ArcMode, PF64 RefArray, PF64 EndArray, PU32 pArrayElements, ARC_DIRECTION Direction, U32 cycCount)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1), c_uint32(2)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1, 2 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\n# # Set 3D Arc mode as relative, which the starting point of circular is (0, 0, 0)\narc_mode = c_uint(ABS_MODE.MOVE_REL.value)\n# Set 3D Arc CW, with 120 degree\n'''\n| axis | point 1 | end point |\n|------|---------|-----------|\n| 0(x) | 20000 | 20000 |\n| 1(y) | 20000 | 40000 |\n| 2(z) | 0 | 20000 |\n'''\nref_arr = [c_double(20000), c_double(20000), c_double(0)]\nrefArr = (c_double * len(ref_arr))(*ref_arr)\nend_arr = [c_double(20000), c_double(40000), c_double(20000)]\nendArr = (c_double * len(end_arr))(*end_arr)\narr_element = c_uint32(len(ref_arr))\n# Set direction as CW\ndir_mode = c_uint(ARC_DIRECTION.ARC_CW.value)\ncyc_cnt = c_uint32(0)\n# Set arc movement with 3 points of circular\nerrCde = AdvMot.Acm2_Gp3DArc_3P(gp_id, arc_mode, refArr, endArr, byref(arr_element), dir_mode, cyc_cnt)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\nget_pos_2 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Get axis 2 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[2], pos_type, byref(get_pos_2))\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_Gp3DArc_3PAngle\nSet 3D group arc points, angle.\n\n```cpp\nU32 Acm2_Gp3DArc_3PAngle(U32 GpID, ABS_MODE ArcMode, PF64 RefPoint_1, PF64 RefPoint_2, PU32 pArrayElements, F64 Degree, ARC_DIRECTION Direction)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1), c_uint32(2)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1, 2 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\n# # Set 3D Arc mode as relative, which the starting point of circular is (0, 0, 0)\narc_mode = c_uint(ABS_MODE.MOVE_REL.value)\n# Set direction as CW\ndir_mode = c_uint(ARC_DIRECTION.ARC_CW.value)\n# Set 3D Arc CW, with 120 degree\n'''\n| axis | point 1 | end point |\n|------|---------|-----------|\n| 0(x) | 20000 | 20000 |\n| 1(y) | 20000 | 40000 |\n| 2(z) | 0 | 20000 |\n'''\nref_arr = [c_double(20000), c_double(20000), c_double(0)]\nrefArr = (c_double * len(ref_arr))(*ref_arr)\nend_arr = [c_double(20000), c_double(40000), c_double(20000)]\nendArr = (c_double * len(end_arr))(*end_arr)\narr_element = c_uint32(len(ref_arr))\ndegree = c_double(120)\n# Set arc movement with 3 point of circular\nerrCde = AdvMot.Acm2_Gp3DArc_3PAngle(gp_id, arc_mode, refArr, endArr, byref(arr_element), degree, dir_mode)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\nget_pos_2 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Get axis 2 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[2], pos_type, byref(get_pos_2))\n# Check value\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_GpHelix_Center\nSet group helix center.\n\n```cpp\nU32 Acm2_GpHelix_Center(U32 GpID, ABS_MODE HelixMode, PF64 CenterArray, PF64 EndArray, PU32\tpArrayElements, ARC_DIRECTION Direction)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1), c_uint32(2)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1, 2 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\n# Set mode as relative\nhelix_mode = c_uint(ABS_MODE.MOVE_REL.value)\n# Set center as (10000, 0, 0)\ncenter_arr = [c_double(10000), c_double(0), c_double(0)]\ncenterArr = (c_double * len(center_arr))(*center_arr)\n# Set end position as (20000, 0, 20000)\nend_arr = [c_double(20000), c_double(0), c_double(20000)]\nendArr = (c_double * len(end_arr))(*end_arr)\narr_element = c_uint32(len(end_arr))\n# Set direction as CW\ndir_mode = c_uint(ARC_DIRECTION.ARC_CW.value)\n# Set Helix movement\nerrCde = AdvMot.Acm2_GpHelix_Center(gp_id, helix_mode, centerArr, endArr, byref(arr_element), dir_mode)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\nget_pos_2 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Get axis 2 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[2], pos_type, byref(get_pos_2))\n# Check value\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_GpHelix_3P\nSet group helix points.\n\n```cpp\nU32 Acm2_GpHelix_3P(U32 GpID, ABS_MODE HelixMode, PF64 RefArray, PF64 EndArray, PU32 pArrayElements, ARC_DIRECTION Direction)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1), c_uint32(2)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1, 2 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\n# Set mode as relative\nhelix_mode = c_uint(ABS_MODE.MOVE_REL.value)\n# Set center as (8000, 0, 0)\ncenter_arr = [c_double(8000), c_double(0), c_double(0)]\ncenterArr = (c_double * len(center_arr))(*center_arr)\n# Set end position as (16000, 16000, 10000)\nend_arr = [c_double(16000), c_double(16000), c_double(10000)]\nendArr = (c_double * len(end_arr))(*end_arr)\narr_element = c_uint32(len(center_arr))\n# Set direction as CW\ndir_mode = c_uint(ARC_DIRECTION.ARC_CW.value)\n# Set Helix movement\nerrCde = AdvMot.Acm2_GpHelix_3P(gp_id, helix_mode, centerArr, endArr, byref(arr_element), dir_mode)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\nget_pos_2 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Get axis 2 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[2], pos_type, byref(get_pos_2))\n# Check value\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_GpHelix_Angle\nSet group helix angle.\n\n```cpp\nU32 Acm2_GpHelix_Angle(U32 GpID, ABS_MODE HelixMode, PF64 CenterArray, PF64 EndArray, PU32 pArrayElements, ARC_DIRECTION Direction)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1), c_uint32(2)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1, 2 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\n# Set mode as relative\nhelix_mode = c_uint(ABS_MODE.MOVE_REL.value)\n# Set center as (200, 0)\ncenter_arr = [c_double(200), c_double(0), c_double(0)]\ncenterArr = (c_double * len(center_arr))(*center_arr)\n# Set 120 as degree\nend_arr = [c_double(4000), c_double(4000), c_double(120)]\nendArr = (c_double * len(end_arr))(*end_arr)\narr_element = c_uint32(len(center_arr))\n# Set direction as CW\ndir_mode = c_uint(ARC_DIRECTION.ARC_CW.value)\n# Set Helix movement\nerrCde = AdvMot.Acm2_GpHelix_Angle(gp_id, helix_mode, centerArr, endArr, byref(arr_element), dir_mode)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\nget_pos_2 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Get axis 2 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[2], pos_type, byref(get_pos_2))\n# Check value\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_GpResume\n\n```cpp\nU32 Acm2_GpResume(U32 GpID)\n```\n\n\n#### Acm2_GpPause\nSet group pause motion.\n\n```cpp\nU32 Acm2_GpPause(U32 GpID)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1), c_uint32(2)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1, 2 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\nfor idx in range(len_get.value):\n# Set mode as relative\nmove_mode = c_uint(GP_LINE_MODE.LINE_REL.value)\nend_arr = [c_double(20000), c_double(20000), c_double(20000)]\nendArr = (c_double * len(end_arr))(*end_arr)\narr_element = c_uint32(len(end_arr))\nerrCde = AdvMot.Acm2_GpLine(gp_id, move_mode, endArr, arr_element)\n# Pause movement\nerrCde = AdvMot.Acm2_GpPause(gp_id)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\nget_pos_2 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Get axis 2 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[2], pos_type, byref(get_pos_2))\n# Check value: Not equal to target position\n# Resume movement\nerrCde = AdvMot.Acm2_GpResume(gp_id)\n# Check status\nwhile state.value != AXIS_STATE.STA_AX_READY.value:\n time.sleep(1)\n test_GetAxState()\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\nget_pos_2 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Get axis 2 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[2], pos_type, byref(get_pos_2))\n# Check value: Equal to target position\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_GpMotionStop\nStop group motion.\n\n```cpp\nU32 Acm2_GpMotionStop(U32 GpID, MOTION_STOP_MODE StopMode, F64 NewDec)\n```\n\n\n#### Acm2_GpChangeVel\nChange velocity of group.\n\n```cpp\nU32 Acm2_GpChangeVel(U32 GpID, F64 NewVelocity, F64 NewAcc, F64 NewDec)\n```\n\n\n#### Acm2_GpChangeVelByRate\nChange group velocity by rate.\n\n```cpp\nU32 Acm2_GpChangeVelByRate(U32 GpID, U32 Rate, F64 NewAcc, F64 NewDec)\n```\n\n\n#### Acm2_GpGetVel\nGet group velocity.\n\n```cpp\nU32 Acm2_GpGetVel(U32 GpID, VELOCITY_TYPE VelType, PF64 Velocity)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1), c_uint32(2)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1, 2 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\nfor idx in range(len_get.value):\n# Set mode as relative\nmove_mode = c_uint(GP_LINE_MODE.LINE_REL.value)\nend_arr = [c_double(200000), c_double(200000), c_double(200000)]\nendArr = (c_double * len(end_arr))(*end_arr)\narr_element = c_uint32(len(end_arr))\nerrCde = AdvMot.Acm2_GpLine(gp_id, move_mode, endArr, arr_element)\n# Check group status\ntime.sleep(2)\ngp_state = c_uint32(0)\nerrCde = AdvMot.Acm2_GpGetState(gp_id, byref(gp_state))\nprint('gp_state:0x{0:x}'.format(gp_state.value))\n# Change velocity\nnew_vel = c_double(5000)\nnew_acc = c_double(9000)\nnew_dec = c_double(4000)\nerrCde = AdvMot.Acm2_GpChangeVel(gp_id, new_vel, new_acc, new_dec)\nvel_type = c_uint(VELOCITY_TYPE.VELOCITY_CMD.value)\nget_gp_vel = c_double(0)\ntime.sleep(2)\nerrCde = AdvMot.Acm2_GpGetVel(gp_id, vel_type, byref(get_gp_vel))\nprint('gp vel:{0}'.format(get_gp_vel.value))\n# Set stop mode as deceleration to stop\nstop_mode = c_uint(MOTION_STOP_MODE.MOTION_STOP_MODE_DEC.value)\nerrCde = AdvMot.Acm2_GpMotionStop(gp_id, stop_mode, new_dec)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\nget_pos_2 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Get axis 2 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[2], pos_type, byref(get_pos_2))\n# Check value: Not equal to target position\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_GpSetSpeedProfile\nGet group speed information.\n\n```cpp\nU32 Acm2_GpSetSpeedProfile(U32 GpID, SPEED_PROFILE_PRM ProfileVel)\n```\n\n\n#### Acm2_GpGetState\nGet group status.\n\n```cpp\nU32 Acm2_GpGetState(U32 GpID, PU32 State)\n```\n\n\n#### Acm2_GpLoadPath\nLoad path table in group.\n\n```cpp\nU32 Acm2_GpLoadPath(U32 GpID, PI8 FilePath, PU32 TotalCount)\n```\n\n\n#### Acm2_GpAddPath\nAdd path into group.\n\n```cpp\nU32 Acm2_GpAddPath(U32 GpID, U32 MoveCmd, PATH_MOVE_MODE_CM2 MoveMode, F64 FH, F64 FL, F64 Acc, F64 Dec, PF64 EndPoint_DataArray, PF64 CenPoint_DataArray, PU32 ArrayElements)\n```\n\n\n#### Acm2_GpMovePath\nStart move group after add path.\n\n```cpp\nU32 Acm2_GpMovePath(U32 GpID)\n```\n\n\n#### Acm2_GpResetPath\nReset group path table.\n\n```cpp\nU32 Acm2_GpResetPath(U32 GpID)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\nfor idx in range(len_get.value):\n# Reset group path\nerrCde = AdvMot.Acm2_GpResetPath(gp_id)\n# Set 2D Arc CW center, end position\n'''\n| axis | Arc center | Arc end |\n|------|------------|---------|\n| 0 | 8000 | 16000 |\n| 1 | 0 | 0 |\n'''\n# Set path table\n'''\n| index | move command | move mode | Vel High | Vel Low | Acc | Dec | End Point | Center Point |\n|-------|--------------|-----------|----------|---------|-----|-----|--------------|--------------|\n| 0 | Rel2DArcCCW |BUFFER_MODE| 8000 | 1000 |10000|10000|(16000, 16000)| (8000, 8000) |\n| 1 | EndPath |BUFFER_MODE| 0 | 0 | 0 | 0 | 0 | 0 |\n'''\nmove_cmd_arr = [c_uint32(MOTION_PATH_CMD.Rel2DArcCCW.value), c_uint32(MOTION_PATH_CMD.EndPath.value)]\nmove_mode = c_uint(PATH_MOVE_MODE_CM2.BUFFER_MODE.value)\nfh = [c_double(8000), c_double(0)]\nfl = [c_double(1000), c_double(0)]\nacc = [c_double(10000), c_double(0)]\ndec = [c_double(10000), c_double(0)]\nend_arr = [\n [c_double(16000), c_double(16000)], \n [c_double(0), c_double(0)]\n]\ncenter_arr = [\n [c_double(8000), c_double(8000)], \n [c_double(0), c_double(0)]\n]\narr_element = c_uint32(len(end_arr[0]))\nfor i in range(1):\n endArr = (c_double * len(end_arr[i]))(*end_arr[i])\n centerArr = (c_double * len(center_arr[i]))(*center_arr[i])\n errCde = AdvMot.Acm2_GpAddPath(gp_id, move_cmd_arr[i], move_mode, fh[i], fl[i], acc[i], dec[i], endArr, centerArr, arr_element)\n# Start move path\nerrCde = AdvMot.Acm2_GpMovePath(gp_id)\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Check value: Equal to target position\n# Reset group path\nerrCde = AdvMot.Acm2_GpResetPath(gp_id)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_GpGetPathStatus\nGet group path status.\n\n```cpp\nU32 Acm2_GpGetPathStatus(U32 GpID, PATH_STATUS *pathStatus)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ngp_ax_arr = [c_uint32(0), c_uint32(1)]\ngp_id = c_uint32(0)\ngp_arr = (c_uint32 * len(gp_ax_arr))(*gp_ax_arr)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n# Creat group 0, and set axis 0, 1 into group\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, len(gp_arr))\n# get_axes size must be same as len_get\nlen_get = c_uint32(64)\nget_axes = (c_uint32 * len_get.value)()\n# Get axes in group 0 and check\nerrCde = AdvMot.Acm2_GpGetAxesInGroup(gp_id, get_axes, len_get)\nfor idx in range(len_get.value):\n# Reset group path\nerrCde = AdvMot.Acm2_GpResetPath(gp_id)\n# Create path file by path editor inside the Utility\npath_bin_file = b'test\\\\testPath.bin'\n'''\n| index | move command | move mode | Vel High | Vel Low | Acc | Dec | End Point |\n|-------|--------------|-----------|----------|---------|-----|-----|--------------|\n| 0 | Rel2DLine |BUFFER_MODE| 8000 | 1000 |10000|10000|(10000, 10000)|\n| 1 | Rel2DLine |BUFFER_MODE| 8000 | 1000 |10000|10000|(10000, 10000)|\n| 2 | EndPath |BUFFER_MODE| 0 | 0 | 0 | 0 | 0 |\n'''\ncnt = c_uint32(0)\nerrCde = AdvMot.Acm2_GpLoadPath(gp_id, path_bin_file, byref(cnt))\n# Start move path\nerrCde = AdvMot.Acm2_GpMovePath(gp_id)\npath_status = c_uint(0)\nerrCde = AdvMot.Acm2_GpGetPathStatus(gp_id, byref(path_status))\n# Check status\nstate = c_uint32(0)\nstate_type = c_uint(AXIS_STATUS_TYPE.AXIS_STATE.value)\nAdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\nwhile (state.value != AXIS_STATE.STA_AX_READY.value):\n time.sleep(1)\n AdvMot.Acm2_AxGetState(ax_id, state_type, byref(state))\n# Get axis 0 position\nget_pos_0 = c_double(0)\nget_pos_1 = c_double(0)\npos_type = c_uint(POSITION_TYPE.POSITION_CMD.value)\n# Get axis 0 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[0], pos_type, byref(get_pos_0))\n# Get axis 1 position\nerrCde = AdvMot.Acm2_AxGetPosition(gp_ax_arr[1], pos_type, byref(get_pos_1))\n# Check value: Equal to target position\n# Reset group path\nerrCde = AdvMot.Acm2_GpResetPath(gp_id)\n# Reset all axes from group 0\nerrCde = AdvMot.Acm2_GpCreate(gp_id, gp_arr, 0)\n```\n\n\n#### Acm2_GpMoveSelPath\n\n```cpp\nU32 Acm2_GpMoveSelPath(U32 GpID, U32 StartIndex, U32 EndIndex, U32 Repeat)\n```\n\n\n#### Acm2_GpGetPathIndexStatus\nGet group information by the index of path table.\n\n```cpp\nU32 Acm2_GpGetPathIndexStatus(U32 GpID, U32 Index, PU32 CmdFunc, PU32 MoveMode, PF64 FH, PF64 FL, PF64 Acc, PF64 Dec, PF64 EndPoint_DataArray, PF64 CenPoint_DataArray, PU32 ArrayElements)\n```\n\n\n#### Acm2_GpDelay\nDelay group.\n\n```cpp\nU32 Acm2_GpDelay(U32 GpID, U32 DelayTime)\n```\n\n\n#### Acm2_GpPathDO\nSet device do on/off between path.\n\n```cpp\nU32 Acm2_GpPathDO(U32 GpID, PATH_DO_PRM PathDOPrm)\n```\n\n\n#### Acm2_GpPathWaitDI\nWait DI status between path.\n\n```cpp\nU32 Acm2_GpPathWaitDI(U32 GpID, PATH_DI_WAIT_PRM DIWaitPrm)\n```\n\n\n#### Acm2_GpPathWaitForAxis\nWait axis between path.\n\n```cpp\nU32 Acm2_GpPathWaitForAxis(U32 GpID, PATH_AX_WAIT_PRM AxWaitPrm)\n```\n\n\n#### Acm2_GpLookAheadPath\n\n```cpp\nU32 Acm2_GpLookAheadPath(U32 GpID, U16 BufferSize, PI8 OutputFile)\n```\n\n\n#### Acm2_GpLookAheadPathFile\n\n```cpp\nU32 Acm2_GpLookAheadPathFile(U32 GpID, U16 BufferSize, PI8 InputPathFile, PI8 OutputFile, PU32 PathCount)\n```\n\n\n\n\n#### Acm2_ChGetDIBit\nGet DI bit by channel.\n\n```cpp\nU32 Acm2_ChGetDIBit(U32 DiChannel, PU32 BitData)\n```\n\n\n#### Acm2_ChSetDOBitByRingNo\nSet DO bit by channel, and ring number.\n\n```cpp\nU32 Acm2_ChSetDOBitByRingNo(U32 RingNo, U32 SlaveID, U32 DoChannel, U32 BitData)\n```\n\n\n#### Acm2_ChGetDOBitByRingNo\nGet DO bit by ring number, and channel.\n\n```cpp\nU32 Acm2_ChGetDOBitByRingNo(U32 RingNo, U32 SlaveID, U32 DoChannel, PU32 BitData)\n```\n\n\n#### Acm2_ChGetDIBitByRingNo\nGet DI bit by ring number, and channel.\n\n```cpp\nU32 Acm2_ChGetDIBitByRingNo(U32 RingNo, U32 SlaveID, U32 DiChannel, PU32 BitData)\n```\n\n\n#### Acm2_ChSetDOByte\nSet DO channel byte.\n\n```cpp\nU32 Acm2_ChSetDOByte(U32 StartPort, U32 NumPort, PU32 ByteDataArray)\n```\n\n\n#### Acm2_ChGetDOByte\nGet DO channel byte.\n\n```cpp\nU32 Acm2_ChGetDOByte(U32 StartPort, U32 NumPort, PU32 ByteDataArray)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\n# Using this example code after connect AMAX-5057SO\n# Check how to start a EtherCAT subdevice by Acm2_DevConnect\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\n# Local DO of PCIE1203 is port 0\nport_num = c_uint32(1)\nstart_ch = c_uint32(0)\nget_byte_value = [c_uint32(0)] * 8\ntime.sleep(0.5)\n# Get DO byte of 5057SO (0~7)\nerrCde = AdvMot.Acm2_ChGetDOByte(start_ch, port_num, byref(get_byte_value[0]))\nset_byte_value_on = [c_uint32(DO_ONOFF.DO_ON.value)] * 8\nset_byte_value_off = [c_uint32(DO_ONOFF.DO_OFF.value)] * 8\nset_value_arr_on = (c_uint32 * len(set_byte_value_on))(*set_byte_value_on)\nset_value_arr_off = (c_uint32 * len(set_byte_value_off))(*set_byte_value_off)\ntime.sleep(0.5)\n# Set DO byte of 5057SO (0~7)\nerrCde = AdvMot.Acm2_ChSetDOByte(start_ch, port_num, set_value_arr_on)\ntime.sleep(1)\n# Get DO byte of 5057SO (0~7)\nerrCde = AdvMot.Acm2_ChGetDOByte(start_ch, port_num, byref(get_byte_value[0]))\ntime.sleep(0.5)\n# Set DO byte of 5057SO (0~7)\nerrCde = AdvMot.Acm2_ChSetDOByte(start_ch, port_num, set_value_arr_off)\n```\n\n\n#### Acm2_ChGetDIByte\nGet DI channel byte.\n\n```cpp\nU32 Acm2_ChGetDIByte(U32 StartPort, U32 NumPort, PU32 ByteDataArray)\n```\n\n\n#### Acm2_ChSetDOByteByRingNo\nSet DO byte by ring number.\n\n```cpp\nU32 Acm2_ChSetDOByteByRingNo(U32 RingNo, U32 SlaveID, U32 StartPort, U32 NumPort, PU32 ByteDataArray)\n```\n\n\n#### Acm2_ChGetDOByteByRingNo\nGet DO byte by ring number.\n\n```cpp\nU32 Acm2_ChGetDOByteByRingNo(U32 RingNo, U32 SlaveID, U32 StartPort, U32 NumPort, PU32 ByteDataArray)\n```\n\n\n#### Acm2_ChGetDIByteByRingNo\nGet DI byte by ring number.\n\n```cpp\nU32 Acm2_ChGetDIByteByRingNo(U32 RingNo, U32 SlaveID, U32 StartPort, U32 NumPort, PU32 ByteDataArray)\n```\n\n\n#### Acm2_ChSetAOData\nSet AO data.\n\n```cpp\nU32 Acm2_ChSetAOData(U32 AoChannel, DAQ_DATA_TYPE Type, F64 AoData)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\n# Using this example code after connect AMAX-4820, AMAX-4817\n# Check how to start a EtherCAT subdevice by Acm2_DevConnect\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\n# Ring as IO Ring\nring_no = c_uint32(1)\n# set by position\nid_type = c_uint(ECAT_ID_TYPE.SUBDEVICE_POS.value)\n# Sort AMAX-4820 in second posiotn\nsub_dev_pos = c_uint32(2)\n# Set AO(0) output range as -10V ~ 10V\npdo_type = c_uint32(ECAT_TYPE.ECAT_TYPE_U16.value)\npdo_data_size = c_uint32(sizeof(c_uint16))\npdo_index = c_uint32(0x2180)\nval_range = c_uint16(3)\npdo_range_sub_index = c_uint32(0x02)\nerrCde = AdvMot.Acm2_DevWriteSDO(ring_no, id_type, sub_dev_pos, pdo_index, pdo_range_sub_index, pdo_type, pdo_data_size, byref(val_range))\n# Set AO(0) output enable\npdo_enable_sub_index = c_uint32(0x01)\nval_enable = c_uint16(1)\nerrCde = AdvMot.Acm2_DevWriteSDO(ring_no, id_type, sub_dev_pos, pdo_index, pdo_enable_sub_index, pdo_type, pdo_data_size, byref(val_enable))\n# AMAX-4820 default AO(0) ~ AO(3)\nao_ch = c_uint32(0)\n# Set AO(0) as 10V\ndata_type = c_uint(DAQ_DATA_TYPE.SCALED_DATA.value)\nao_data = c_double(10)\nerrCde = AdvMot.Acm2_ChSetAOData(ao_ch, data_type, ao_data)\n# Get AO(0) data\nget_data_ao = c_double(0)\nerrCde = AdvMot.Acm2_ChGetAOData(ao_ch, data_type, byref(get_data_ao))\nassertAlmostEqual(ao_data.value, get_data_ao.value, delta=1.0)\n# Get AI(0) data\nget_data_ai = c_double(0)\nerrCde = AdvMot.Acm2_ChGetAIData(ao_ch, data_type, byref(get_data_ai))\n```\n\n\n#### Acm2_ChGetAOData\nGet AO data.\n\n```cpp\nU32 Acm2_ChGetAOData(U32 AoChannel, DAQ_DATA_TYPE Type, PF64 AoData)\n```\n\n\n#### Acm2_ChSetAODataByRingNo\nSet AO data by ring number.\n\n```cpp\nU32 Acm2_ChSetAODataByRingNo(U32 RingNo, U32 SlaveID, U32 AoChannel, DAQ_DATA_TYPE Type, F64 AoData)\n```\n\n\n#### Acm2_ChGetAODataByRingNo\nGet AO data by ring number.\n\n```cpp\nU32 Acm2_ChGetAODataByRingNo(U32 RingNo, U32 SlaveID, U32 AoChannel, DAQ_DATA_TYPE Type, PF64 AoData)\n```\n\n\n#### Acm2_ChGetAIData\nGet AI data.\n\n```cpp\nU32 Acm2_ChGetAIData(U32 AiChannel, DAQ_DATA_TYPE Type, PF64 AiData)\n```\n\n\n#### Acm2_ChGetAIDataByRingNo\nGet AI data by ring number.\n\n```cpp\nU32 Acm2_ChGetAIDataByRingNo(U32 RingNo, U32 SlaveID, U32 AiChannel, DAQ_DATA_TYPE Type, PF64 AiData)\n```\n\n\n#### Acm2_ChGetCntData\nGet counter data.\n\n```cpp\nU32 Acm2_ChGetCntData(U32 CntChannel, PF64 CounterData)\n```\n\n\n#### Acm2_ChSetCntData\nSet counter data.\n\n```cpp\nU32 Acm2_ChSetCntData(U32 CntChannel, F64 CounterData)\n```\n\n\n#### Acm2_ChLinkCmpFIFO\nSet compare position.\n\n```cpp\nU32 Acm2_ChLinkCmpFIFO(U32 ChID, PU32 AxisArray, U32 ArrayElement)\n```\n\n\n#### Acm2_ChLinkCmpObject\nLink compare do with axis/counter.\n\n```cpp\nU32 Acm2_ChLinkCmpObject(U32 ChID, ADV_OBJ_TYPE ObjType, PU32 ObjArray, U32 ArrayElement)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\n# Using this example code after connect AMAX-4820, AMAX-4817\n# Check how to start a EtherCAT subdevice by Acm2_DevConnect\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ncnt_ch = c_uint32(1)\n# Local CMP Diff channel is 2\ncmp_ch = c_uint32(2)\n# Set encoder(0) pulse in mode as CW/CCW.\nppt_arr = c_uint32(PropertyID2.CFG_CH_DaqCntPulseInMode.value)\nval_arr = c_double(PULSE_IN_MODE.I_CW_CCW.value)\nget_val = c_double(0)\nget_cnt_data = c_double(0)\nerrCde = AdvMot.Acm2_SetProperty(cnt_ch, ppt_arr, val_arr)\nerrCde = AdvMot.Acm2_GetProperty(cnt_ch, ppt_arr, byref(get_val))\nerrCde = AdvMot.Acm2_ChGetCntData(cnt_ch, byref(get_cnt_data))\n# Link local encoder/counter to compare\ncnt_arr = [cnt_ch]\ntrans_cnt_arr = (c_uint32 * len(cnt_arr))(*cnt_arr)\naxis_type = c_uint(ADV_OBJ_TYPE.ADV_COUNTER_CHANNEL.value)\n# Reset Link connection\nerrCde = AdvMot.Acm2_ChLinkCmpObject(cmp_ch, axis_type, trans_cnt_arr, 0)\nerrCde = AdvMot.Acm2_ChLinkCmpObject(cmp_ch, axis_type, trans_cnt_arr, len(cnt_arr))\n# Set compare property, disable compare before setting.\ncmp_set_arr = [c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoOutputMode.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoLogic.value)]\nval_arr = [c_double(COMPARE_ENABLE.CMP_DISABLE.value),\n c_double(COMPARE_OUTPUT_MODE.CMP_TOGGLE.value),\n c_double(COMPARE_LOGIC.CP_ACT_LOW.value)]\nfor i in range(len(cmp_set_arr)):\n errCde = AdvMot.Acm2_SetProperty(cmp_ch, cmp_set_arr[i].value, val_arr[i])\n# Get value\nget_val = c_double(0)\nfor i in range(len(val_arr)):\n errCde = AdvMot.Acm2_GetProperty(cmp_ch, cmp_set_arr[i], byref(get_val))\nend_pos = c_double(2500)\n# Enable compare\nerrCde = AdvMot.Acm2_SetProperty(cmp_ch, c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value).value, c_double(COMPARE_ENABLE.CMP_ENABLE.value).value)\n# Set compare data table\n# Compare DO behavior: ---ON--- ---OFF--- ---ON--- ---OFF---\nset_cmp_data_arr = [c_double(500), c_double(1000), c_double(1500), c_double(2000)]\ntrans_cmp_data_arr = (c_double * len(set_cmp_data_arr))(*set_cmp_data_arr)\nerrCde = AdvMot.Acm2_ChSetCmpBufferData(cmp_ch, trans_cmp_data_arr, len(set_cmp_data_arr))\n# Reset encoder data as 0\nreset_cnt_data = c_double(0)\nerrCde = AdvMot.Acm2_ChSetCntData(cnt_ch, reset_cnt_data)\n# Get encoder data\nget_cnt_data = c_double(0)\nwhile get_cnt_data.value <= end_pos.value:\n time.sleep(0.1)\n errCde = AdvMot.Acm2_ChGetCntData(cnt_ch, byref(get_cnt_data))\n# Disable compare\nerrCde = AdvMot.Acm2_SetProperty(cmp_ch, c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value).value, c_double(COMPARE_ENABLE.CMP_DISABLE.value).value)\n```\n\n\n#### Acm2_ChGetLinkedCmpObject\nGet compare do linked object.\n\n```cpp\nU32 Acm2_ChGetLinkedCmpObject(U32 ChID, ADV_OBJ_TYPE *ObjType, PU32 ObjArray, PU32 ArrayElement)\n```\n\n\n#### Acm2_ChEnableCmp\nEnable compare channel.\n\n```cpp\nU32 Acm2_ChEnableCmp(U32 ChID, U32 Enable)\n```\n\n\n#### Acm2_ChSetCmpOut\nSet compare channel on/off.\n\n```cpp\nU32 Acm2_ChSetCmpOut(U32 ChID, DO_ONOFF OnOff)\n```\n\n\n#### Acm2_ChSetCmpDoOut\nSet compare on/off.\n\n```cpp\nU32 Acm2_ChSetCmpDoOut(U32 ChID, DO_ONOFF OnOff)\n```\n\n\n#### Acm2_AxGetCmpData\nGet compared data by axis.\n\n```cpp\nU32 Acm2_AxGetCmpData(U32 AxID, PF64 CmpData)\n```\n\n\n#### Acm2_ChGetCmpData\nGet compared data by channel.\n\n```cpp\nU32 Acm2_ChGetCmpData(U32 CmpChannel, PF64 CmpData, U32 ObjectArrayCount)\n```\n\n\n#### Acm2_AxSetCmpTable\nSet compare table by axis.\n\n```cpp\nU32 Acm2_AxSetCmpTable(U32 AxID, PF64 TableArray, U32 ArrayElement)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\n# Pulse mode\ncnt_ch = c_uint32(0)\ncmp_ch = c_uint32(0)\n# Set encoder(0) pulse in mode as CW/CCW.\nppt_arr = c_uint32(PropertyID2.CFG_CH_DaqCntPulseInMode.value)\nval_arr = c_double(PULSE_IN_MODE.I_CW_CCW.value)\nget_val = c_double(0)\nerrCde = AdvMot.Acm2_SetProperty(cnt_ch, ppt_arr, val_arr)\nerrCde = AdvMot.Acm2_GetProperty(cnt_ch, ppt_arr, byref(get_val))\n# Set compare property, disable compare before setting.\ncmp_set_arr = [c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoOutputMode.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoLogic.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoPulseWidth.value)]\nval_arr = [c_double(COMPARE_ENABLE.CMP_DISABLE.value),\n c_double(COMPARE_OUTPUT_MODE.CMP_PULSE.value),\n c_double(COMPARE_LOGIC.CP_ACT_LOW.value),\n c_double(500000)]\nfor i in range(len(cmp_set_arr)):\n errCde = AdvMot.Acm2_SetProperty(cmp_ch, cmp_set_arr[i].value, val_arr[i])\n# Get value\nget_val = c_double(0)\nfor i in range(len(val_arr)):\n errCde = AdvMot.Acm2_GetProperty(cmp_ch, cmp_set_arr[i], byref(get_val))\n# Link local encoder/counter to compare\ncnt_arr = [cnt_ch]\ntrans_cnt_arr = (c_uint32 * len(cnt_arr))(*cnt_arr)\naxis_type = c_uint(ADV_OBJ_TYPE.ADV_COUNTER_CHANNEL.value)\nerrCde = AdvMot.Acm2_ChLinkCmpObject(cmp_ch, axis_type, trans_cnt_arr, len(cnt_arr))\nend_pos = c_double(2500)\n# Set compare data table\n# Compare DO behavior: ---ON--- ---OFF--- ---ON--- ---OFF---\nset_cmp_data_arr = [c_double(500), c_double(1000), c_double(1500), c_double(2000)]\ntrans_cmp_data_arr = (c_double * len(set_cmp_data_arr))(*set_cmp_data_arr)\nerrCde = AdvMot.Acm2_ChSetCmpBufferData(cmp_ch, trans_cmp_data_arr, len(set_cmp_data_arr))\n# Reset encoder data as 0\nreset_cnt_data = c_double(0)\nerrCde = AdvMot.Acm2_ChSetCntData(cnt_ch, reset_cnt_data)\n# Enable compare\nerrCde = AdvMot.Acm2_SetProperty(cmp_ch, c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value).value, c_double(COMPARE_ENABLE.CMP_ENABLE.value).value)\n# Get encoder data\nget_cnt_data = c_double(0)\nwhile get_cnt_data.value < end_pos.value:\n time.sleep(0.1)\n errCde = AdvMot.Acm2_ChGetCntData(cnt_ch, byref(get_cnt_data))\n# Disable compare\nerrCde = AdvMot.Acm2_SetProperty(cmp_ch, c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value).value, c_double(COMPARE_ENABLE.CMP_DISABLE.value).value)\n```\n\n\n\n#### Acm2_AxSetCmpAuto\nSet auto compare by axis.\n\n```cpp\nU32 Acm2_AxSetCmpAuto(U32 AxID, F64 StartPosition, F64 EndPosition, F64 Interval)\n```\n\n\n#### Acm2_ChSetCmpAuto\nSet auto compare by channel.\n\n```cpp\nU32 Acm2_ChSetCmpAuto(U32 CmpChannel, F64 StartPosition, F64 EndPosition, F64 Interval)\n```\n\n\n#### Acm2_ChSetCmpBufferData\nSet compare buffer.\n\n```cpp\nU32 Acm2_ChSetCmpBufferData(U32 CmpChannel, PF64 TableArray, U32 ArrayElement)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\n# Toggle Mode\ncnt_ch = c_uint32(0)\ncmp_ch = c_uint32(0)\n# Set encoder(0) pulse in mode as CW/CCW.\nppt_arr = c_uint32(PropertyID2.CFG_CH_DaqCntPulseInMode.value)\nval_arr = c_double(PULSE_IN_MODE.I_CW_CCW.value)\nget_val = c_double(0)\nerrCde = AdvMot.Acm2_SetProperty(cnt_ch, ppt_arr, val_arr)\nerrCde = AdvMot.Acm2_GetProperty(cnt_ch, ppt_arr, byref(get_val))\n# Set compare property, disable compare before setting.\ncmp_set_arr = [c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoOutputMode.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoLogic.value)]\nval_arr = [c_double(COMPARE_ENABLE.CMP_DISABLE.value),\n c_double(COMPARE_OUTPUT_MODE.CMP_TOGGLE.value),\n c_double(COMPARE_LOGIC.CP_ACT_LOW.value)]\nfor i in range(len(cmp_set_arr)):\n errCde = AdvMot.Acm2_SetProperty(cmp_ch, cmp_set_arr[i].value, val_arr[i])\n# Get value\nget_val = c_double(0)\nfor i in range(len(val_arr)):\n errCde = AdvMot.Acm2_GetProperty(cmp_ch, cmp_set_arr[i], byref(get_val))\n# Link local encoder/counter to compare\ncnt_arr = [cnt_ch]\ntrans_cnt_arr = (c_uint32 * len(cnt_arr))(*cnt_arr)\naxis_type = c_uint(ADV_OBJ_TYPE.ADV_COUNTER_CHANNEL.value)\nerrCde = AdvMot.Acm2_ChLinkCmpObject(cmp_ch, axis_type, trans_cnt_arr, len(cnt_arr))\nend_pos = c_double(2500)\n# Set compare data table\n# Compare DO behavior: ---ON--- ---OFF--- ---ON--- ---OFF---\nset_cmp_data_arr = [c_double(500), c_double(1000), c_double(1500), c_double(2000)]\ntrans_cmp_data_arr = (c_double * len(set_cmp_data_arr))(*set_cmp_data_arr)\nerrCde = AdvMot.Acm2_ChSetCmpBufferData(cmp_ch, trans_cmp_data_arr, len(set_cmp_data_arr))\n# Reset encoder data as 0\nreset_cnt_data = c_double(0)\nerrCde = AdvMot.Acm2_ChSetCntData(cnt_ch, reset_cnt_data)\n# Enable compare\nerrCde = AdvMot.Acm2_SetProperty(cmp_ch, c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value).value, c_double(COMPARE_ENABLE.CMP_ENABLE.value).value)\n# Get encoder data\nget_cnt_data = c_double(0)\nwhile get_cnt_data.value < end_pos.value:\n time.sleep(0.1)\n errCde = AdvMot.Acm2_ChGetCntData(cnt_ch, byref(get_cnt_data))\n# Disable compare\nerrCde = AdvMot.Acm2_SetProperty(cmp_ch, c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value).value, c_double(COMPARE_ENABLE.CMP_DISABLE.value).value)\n```\n\n\n\n#### Acm2_ChSetMultiCmpTable\nSet compare table.\n\n```cpp\nU32 Acm2_ChSetMultiCmpTable(U32 ChID, PF64 TableArray, U32 ObjectArrayCount, U32 DataArrayCount)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ncnt_ch = [c_uint32(0), c_uint32(1)]\ncmp_ch = c_uint32(0)\nltc_ch = c_uint32(0)\n# Set encoder(0) pulse in mode as CW/CCW.\nppt_arr = c_uint32(PropertyID2.CFG_CH_DaqCntPulseInMode.value)\nval_arr = c_double(PULSE_IN_MODE.I_CW_CCW.value)\nget_val = c_double(0)\nfor i in range(len(cnt_ch)):\n errCde = AdvMot.Acm2_SetProperty(cnt_ch[i], ppt_arr, val_arr)\n errCde = AdvMot.Acm2_GetProperty(cnt_ch[i], ppt_arr, byref(get_val))\n# Link local encoder/counter to compare\ncnt_arr = cnt_ch\ntrans_cnt_arr = (c_uint32 * len(cnt_arr))(*cnt_arr)\naxis_type = c_uint(ADV_OBJ_TYPE.ADV_COUNTER_CHANNEL.value)\nerrCde = AdvMot.Acm2_ChLinkCmpObject(cmp_ch, axis_type, trans_cnt_arr, len(cnt_arr))\nget_obj_type = c_uint(0)\nget_linked_arr = (c_uint32 * 2)()\nget_linked_cnt = c_uint32(2)\n# Get linked local encoder/counter to compare\nerrCde = AdvMot.Acm2_ChGetLinkedCmpObject(cmp_ch, byref(get_obj_type), get_linked_arr, byref(get_linked_cnt))\nprint('[CMP] Linked type:{0}, linked count:{1}'.format(get_obj_type.value, get_linked_cnt.value))\nfor i in range(get_linked_cnt.value):\n print('Linked channel:{0}'.format(get_linked_arr[i]))\n# Set compare property, disable compare before setting.\ncmp_set_arr = [c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoOutputMode.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoLogic.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoPulseWidth.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDeviation.value)]\nval_arr = [c_double(COMPARE_ENABLE.CMP_DISABLE.value),\n c_double(COMPARE_OUTPUT_MODE.CMP_PULSE.value),\n c_double(COMPARE_LOGIC.CP_ACT_LOW.value),\n c_double(500000), c_double(100)]\nfor i in range(len(cmp_set_arr)):\n errCde = AdvMot.Acm2_SetProperty(cmp_ch, cmp_set_arr[i].value, val_arr[i])\n# Get CMP proerty\nget_val = c_double(0)\nfor i in range(len(val_arr)):\n errCde = AdvMot.Acm2_GetProperty(cmp_ch, cmp_set_arr[i], byref(get_val))\n# Get linked local encoder/counter to latch\nerrCde = AdvMot.Acm2_ChGetLinkedLatchObject(ltc_ch, byref(get_obj_type), get_linked_arr, byref(get_linked_cnt))\nprint('[LTC] Linked type:{0}, linked count:{1}'.format(get_obj_type.value, get_linked_cnt.value))\nfor i in range(get_linked_cnt.value):\n print('Linked channel:{0}'.format(get_linked_arr[i]))\n# Reset LTC buffer\nerrCde = AdvMot.Acm2_ChResetLatchBuffer(ltc_ch)\n# Set LTC property\nltc_set_ppt_arr = [c_uint32(PropertyID2.CFG_CH_DaqLtcMinDist.value),\n c_uint32(PropertyID2.CFG_CH_DaqLtcLogic.value),\n c_uint32(PropertyID2.CFG_CH_DaqLtcEnable.value)]\nltc_val_arr = [c_double(10), c_double(COMPARE_LOGIC.CP_ACT_LOW.value), c_double(COMPARE_ENABLE.CMP_ENABLE.value)]\nfor i in range(len(ltc_set_ppt_arr)):\n errCde = AdvMot.Acm2_SetProperty(ltc_ch, ltc_set_ppt_arr[i].value, ltc_val_arr[i])\n# Get LTC property\nget_val_ltc = c_double(0)\nfor i in range(len(ltc_val_arr)):\n errCde = AdvMot.Acm2_GetProperty(ltc_ch, ltc_set_ppt_arr[i], byref(get_val_ltc))\n\n# Set compare data\nset_cmp_data_arr = [c_double(500), c_double(1000), c_double(1500), c_double(2000), c_double(2500), c_double(3000),\n c_double(550), c_double(1050), c_double(1550), c_double(2050), c_double(2550), c_double(3050)]\ntrans_cmp_data_arr = (c_double * len(set_cmp_data_arr))(*set_cmp_data_arr)\nerrCde = AdvMot.Acm2_ChSetMultiCmpBufferData(cmp_ch, trans_cmp_data_arr, len(cnt_ch), c_uint32(int(len(set_cmp_data_arr) / len(cnt_ch))))\n# Reset encoder data as 0\nreset_cnt_data = c_double(0)\nfor i in range(len(cnt_ch)):\n errCde = AdvMot.Acm2_ChSetCntData(cnt_ch[i], reset_cnt_data)\n# Enable compare\nerrCde = AdvMot.Acm2_SetProperty(cmp_ch, c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value).value, c_double(COMPARE_ENABLE.CMP_ENABLE.value).value)\n# Get encoder data\nget_cnt_data = c_double(0)\nend_pos = c_double(3500)\nwhile get_cnt_data.value <= end_pos.value:\n time.sleep(0.1)\n for i in range(len(cnt_ch)):\n tmp_ch = c_uint32(i)\n errCde = AdvMot.Acm2_ChGetCntData(tmp_ch, byref(get_cnt_data))\n# Get LTC data\nget_ltc_buf_status = BUFFER_STATUS()\nact_data_cnt = c_uint32(128)\nget_ltc_data_arr = (c_double * act_data_cnt.value)()\nerrCde = AdvMot.Acm2_ChGetLatchBufferStatus(ltc_ch, byref(get_ltc_buf_status))\nprint('RemainCount:{0}, FreeSpaceCount:{1}'.format(get_ltc_buf_status.RemainCount, get_ltc_buf_status.FreeSpaceCount))\nerrCde = AdvMot.Acm2_ChReadLatchBuffer(ltc_ch, get_ltc_data_arr, act_data_cnt, byref(act_data_cnt))\nprint('act_data_cnt:{0}'.format(act_data_cnt.value))\nfor i in range(act_data_cnt.value):\n print('get_ltc_data_arr[{0}]:{1}'.format(i, get_ltc_data_arr[i]))\n# Disable compare and latch\nerrCde = AdvMot.Acm2_SetProperty(cmp_ch, c_uint32(PropertyID2.CFG_CH_DaqLtcEnable.value).value,\n c_double(COMPARE_ENABLE.CMP_DISABLE.value).value)\nerrCde = AdvMot.Acm2_SetProperty(ltc_ch, c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value).value,\n c_double(COMPARE_ENABLE.CMP_DISABLE.value).value)\n```\n\n\n#### Acm2_ChSetMultiCmpBufferData\nSet multi compare buffer.\n\n```cpp\nU32 Acm2_ChSetMultiCmpBufferData(U32 ChID, PF64 MultiCmpTable, U32 ObjectArrayCount, U32 DataArrayCount)\n```\n\n\n#### Acm2_ChResetCmpData\nReset compare data.\n\n```cpp\nU32 Acm2_ChResetCmpData(U32 CmpChannel)\n```\n\n\n#### Acm2_ChGetCmpBufferStatus\nGet compared buffer status.\n\n```cpp\nU32\tAcm2_ChGetCmpBufferStatus(U32 CmpChannel, PBUFFER_STATUS bufferstatus)\n```\n\n\n#### Acm2_ChLinkLatchAxis\nLink latch to axis.\n```cpp\nU32 Acm2_ChLinkLatchAxis(U32 ChID, PU32 AxisArray, U32 AxisCount)\n```\n\n\n#### Acm2_ChLinkLatchObject\nLift latch to object.\n```cpp\nU32 Acm2_ChLinkLatchObject(U32 ChID, ADV_OBJ_TYPE ObjType, PU32 ObjArray, U32 ArrayElement)\n```\n\n\n#### Acm2_ChGetLinkedLatchObject\nGet linked latch object.\n```cpp\nU32 Acm2_ChGetLinkedLatchObject(U32 ChID, ADV_OBJ_TYPE *ObjType, PU32 ObjArray, PU32 ArrayElement)\n```\n\n\n#### Acm2_ChTriggerLatch\nTrigger latch by channel.\n\n```cpp\nU32 Acm2_ChTriggerLatch(U32 ChID)\n```\n\n\n#### Acm2_AxReadLatchBuffer\nRead latch buffer.\n\n```cpp\nU32\tAcm2_AxReadLatchBuffer(U32 AxID, PF64 LatchDataArray, PU32 DataCnt)\n```\n\n\n#### Acm2_ChReadLatchBuffer\nRead latch buffer by channel.\n\n```cpp\nU32\tAcm2_ChReadLatchBuffer(U32 LtcChannel, PF64 LatchDataArray, U32 ObjectArrayCount, PU32 DataArrayCount)\n```\n\n\n#### Acm2_AxGetLatchBufferStatus\nGet latch buffer status.\n\n```cpp\nU32\tAcm2_AxGetLatchBufferStatus(U32 AxID, PU32 RemainCnt, PU32 SpaceCnt)\n```\n\n\n#### Acm2_ChGetLatchBufferStatus\nGet latch buffer status by channel.\n\n```cpp\nU32\tAcm2_ChGetLatchBufferStatus(U32 LtcChannel, BUFFER_STATUS *bufferstatus)\n```\n```python\n# Example code\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\n# Using this example code after connect AMAX-4820, AMAX-4817\n# Check how to start a EtherCAT subdevice by Acm2_DevConnect\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\ncnt_ch = c_uint32(0)\ncmp_ch = c_uint32(0)\nltc_ch = c_uint32(0)\n# Set encoder(0) pulse in mode as CW/CCW.\nppt_arr = c_uint32(PropertyID2.CFG_CH_DaqCntPulseInMode.value)\nval_arr = c_double(PULSE_IN_MODE.I_CW_CCW.value)\nget_val = c_double(0)\nerrCde = AdvMot.Acm2_SetProperty(cnt_ch, ppt_arr, val_arr)\nerrCde = AdvMot.Acm2_GetProperty(cnt_ch, ppt_arr, byref(get_val))\n# Link local encoder/counter to compare\ncnt_arr = [cnt_ch]\ntrans_cnt_arr = (c_uint32 * len(cnt_arr))(*cnt_arr)\naxis_type = c_uint(ADV_OBJ_TYPE.ADV_COUNTER_CHANNEL.value)\nerrCde = AdvMot.Acm2_ChLinkCmpObject(cmp_ch, axis_type, trans_cnt_arr, len(cnt_arr))\n# Set compare property, disable compare before setting.\ncmp_set_arr = [c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoOutputMode.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoLogic.value),\n c_uint32(PropertyID2.CFG_CH_DaqCmpDoPulseWidth.value)]\nval_arr = [c_double(COMPARE_ENABLE.CMP_DISABLE.value),\n c_double(COMPARE_OUTPUT_MODE.CMP_PULSE.value),\n c_double(COMPARE_LOGIC.CP_ACT_LOW.value),\n c_double(500000)]\nfor i in range(len(cmp_set_arr)):\n errCde = AdvMot.Acm2_SetProperty(cmp_ch, cmp_set_arr[i].value, val_arr[i])\n# Get CMP proerty\nget_val = c_double(0)\nfor i in range(len(val_arr)):\n errCde = AdvMot.Acm2_GetProperty(cmp_ch, cmp_set_arr[i], byref(get_val))\n\n# Get linked local encoder/counter to latch\nget_obj_type = c_uint(0)\nget_linked_arr = (c_uint32 * 2)()\nget_linked_cnt = c_uint32(2)\nerrCde = AdvMot.Acm2_ChGetLinkedLatchObject(ltc_ch, byref(get_obj_type), get_linked_arr, byref(get_linked_cnt))\nprint('Linked type:{0}, linked count:{1}'.format(get_obj_type.value, get_linked_cnt.value))\nfor i in range(get_linked_cnt.value):\n print('Linked channel:{0}'.format(get_linked_arr[i]))\n# Reset LTC buffer\nerrCde = AdvMot.Acm2_ChResetLatchBuffer(ltc_ch)\n# Set LTC property\nltc_set_ppt_arr = [c_uint32(PropertyID2.CFG_CH_DaqLtcMinDist.value),\n c_uint32(PropertyID2.CFG_CH_DaqLtcLogic.value),\n c_uint32(PropertyID2.CFG_CH_DaqLtcEnable.value)]\nltc_val_arr = [c_double(10), c_double(COMPARE_LOGIC.CP_ACT_LOW.value), c_double(COMPARE_ENABLE.CMP_ENABLE.value)]\nfor i in range(len(ltc_set_ppt_arr)):\n errCde = AdvMot.Acm2_SetProperty(ltc_ch, ltc_set_ppt_arr[i].value, ltc_val_arr[i])\n# Get LTC property\nget_val_ltc = c_double(0)\nfor i in range(len(ltc_val_arr)):\n errCde = AdvMot.Acm2_GetProperty(ltc_ch, ltc_set_ppt_arr[i], byref(get_val_ltc))\n\n# Set compare data\nset_cmp_data_arr = [c_double(500), c_double(1000), c_double(1500), c_double(2000)]\ntrans_cmp_data_arr = (c_double * len(set_cmp_data_arr))(*set_cmp_data_arr)\nerrCde = AdvMot.Acm2_ChSetCmpBufferData(cmp_ch, trans_cmp_data_arr, len(set_cmp_data_arr))\n# Reset encoder data as 0\nreset_cnt_data = c_double(0)\nerrCde = AdvMot.Acm2_ChSetCntData(cnt_ch, reset_cnt_data)\n# Enable compare\nerrCde = AdvMot.Acm2_SetProperty(cmp_ch, c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value).value, c_double(COMPARE_ENABLE.CMP_ENABLE.value).value)\n# Get encoder data\nget_cnt_data = c_double(0)\nend_pos = c_double(2500)\nwhile get_cnt_data.value <= end_pos.value:\n time.sleep(0.1)\n for i in range(2):\n tmp_ch = c_uint32(i)\n errCde = AdvMot.Acm2_ChGetCntData(tmp_ch, byref(get_cnt_data))\n print('[{0}]get_cnt_data:{1}'.format(i, get_cnt_data.value))\n errCde = AdvMot.Acm2_ChGetCntData(cnt_ch, byref(get_cnt_data))\n# Get LTC data\nget_ltc_buf_status = BUFFER_STATUS()\nget_data_cnt = c_uint32(10)\nact_data_cnt = c_uint32(128)\nget_ltc_data_arr = (c_double * get_data_cnt.value)()\nerrCde = AdvMot.Acm2_ChGetLatchBufferStatus(ltc_ch, byref(get_ltc_buf_status))\nprint('RemainCount:{0}, FreeSpaceCount:{1}'.format(get_ltc_buf_status.RemainCount, get_ltc_buf_status.FreeSpaceCount))\nerrCde = AdvMot.Acm2_ChReadLatchBuffer(ltc_ch, get_ltc_data_arr, get_data_cnt, byref(act_data_cnt))\nprint('act_data_cnt:{0}'.format(act_data_cnt.value))\nfor i in range(act_data_cnt.value):\n print('get_ltc_data_arr[{0}]:{1}'.format(i, get_ltc_data_arr[i]))\n# Disable compare and latch\nerrCde = AdvMot.Acm2_SetProperty(cmp_ch, c_uint32(PropertyID2.CFG_CH_DaqLtcEnable.value).value,\n c_double(COMPARE_ENABLE.CMP_DISABLE.value).value)\nerrCde = AdvMot.Acm2_SetProperty(ltc_ch, c_uint32(PropertyID2.CFG_CH_DaqCmpDoEnable.value).value,\n c_double(COMPARE_ENABLE.CMP_DISABLE.value).value)\n```\n\n\n#### Acm2_AxResetLatchBuffer\nReset latch buffer.\n\n```cpp\nU32\tAcm2_AxResetLatchBuffer(U32 AxID)\n```\n\n\n#### Acm2_ChResetLatchBuffer\nReset latch buffer by channel.\n\n```cpp\nU32\tAcm2_ChResetLatchBuffer(U32 LtcChannel)\n```\n\n\n#### Acm2_ChLinkPWMTable\nLink PWM with object.\n\n```cpp\nU32 Acm2_ChLinkPWMTable(U32 ChID, ADV_OBJ_TYPE ObjType, U32 ObjectID)\n```\n\n\n#### Acm2_ChGetLinkedPWMTable\nGet linked PWM Acm2_ChSetPWMTabletable by channel.\n\n```cpp\nU32 Acm2_ChGetLinkedPWMTable(U32 ChID, ADV_OBJ_TYPE *ObjType, PU32 ObjArray, PU32 ArrayElement)\n```\n\n\n#### Acm2_ChSetPWMTable\nSet PWM table by channel.\n\n```cpp\nU32 Acm2_ChSetPWMTable(U32 ChID, PF64 VelocityArray, PF64 PWMArray, U32 ArrayElements)\n```\n\n\n#### Acm2_ChLoadPWMTableFile\nLoal PWM table file.\n\n```cpp\nU32 Acm2_ChLoadPWMTableFile(U32 ChID, PI8 FilePath, PU32 PointsCount)\n```\n\n\n#### Acm2_ChGetPWMTableStatus\nGet PWM table status.\n\n```cpp\nU32\tAcm2_ChGetPWMTableStatus(U32 ChID, PWM_TABLE_STATUS *PWMStatus)\n```\n\n\n#### Acm2_ChGetExtDriveData\nGet external drive data by channel.\n\n```cpp\nU32 Acm2_ChGetExtDriveData(U32 ExtChannel, PF64 CounterData)\n```\n\n\n#### Acm2_ChSetExtDriveData\nSet external drive data by channel.\n\n```cpp\nU32 Acm2_ChSetExtDriveData(U32 ExtChannel, F64 CounterData)\n```\n\n\n#### Acm2_ChLinkExtDriveObject\nLink external drive object.\n\n```cpp\nU32 Acm2_ChLinkExtDriveObject(U32 ChID, ADV_OBJ_TYPE ObjType, U32 ObjectID)\n```\n\n\n#### Acm2_ChGetLinkedExtDriveObject\nGet linked external drive object.\n\n```cpp\nU32 Acm2_ChGetLinkedExtDriveObject(U32 ChID, ADV_OBJ_TYPE *ObjType, PU32 ObjArray, PU32 ArrayElement)\n```\n\n\n#### Acm2_DevMDaqConfig\nSet MDAQ config.\n\n```cpp\nU32 Acm2_DevMDaqConfig(U32 ChannelID, U32 Period, U32 AxisNo, U32 Method, U32 ChanType, U32 Count)\n```\n\n\n#### Acm2_DevMDaqGetConfig\nGet MDAQ config.\n\n```cpp\nU32 Acm2_DevMDaqGetConfig(U32 ChannelID, PU32 Period, PU32 AxisNo, PU32 Method, PU32 ChanType, PU32 Count)\n```\n\n\n#### Acm2_DevMDaqStart\nStart MDAQ.\n\n```cpp\nU32 Acm2_DevMDaqStart(U32 DevID)\n```\n\n\n#### Acm2_DevMDaqStop\nStop MDAQ.\n\n```cpp\nU32 Acm2_DevMDaqStop(U32 DevID)\n```\n\n\n#### Acm2_DevMDaqReset\nReset MDAQ.\n\n```cpp\nU32 Acm2_DevMDaqReset(U32 ChannelID)\n```\n\n\n#### Acm2_DevMDaqGetStatus\nGet MDAQ status.\n\n```cpp\nU32 Acm2_DevMDaqGetStatus(U32 ChannelID, PU32 CurrentCnt, PU32 Status)\n```\n\n\n#### Acm2_DevMDaqGetData\nGet MDAQ data.\n\n```cpp\nU32 Acm2_DevMDaqGetData(U32 ChannelID, U32 StartIndex, U32 MaxCount, PF64 DataBuffer)\n```\n\n\n#### Acm2_GetDSPFrmWareDwnLoadRate\nGet FW download rate.\n\n```cpp\nU32 Acm2_GetDSPFrmWareDwnLoadRate(U32 DevID, PF64 Percentage)\n```\n\n\n#### Acm2_DevLoadENI\nDownload ENI file.\n\n```cpp\nU32 Acm2_DevLoadENI(U32 RingNo, PI8 ENIFile)\n```\n\n\n#### Acm2_DevConnect\nConnect subdevices.\n\n```cpp\nU32 Acm2_DevConnect(U32 RingNo)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\n# eni file can be create by the Utility\neni_path = b'test\\\\63000000_eni1.xml'\n# Motion ring number:0, IO Ring number:1, IORing is SM mode only\nring_no = c_uint32(1)\nerrCde = AdvMot.Acm2_DevLoadENI(ring_no, eni_path)\n# After load eni file, StartFieldbus/Connect to subdevices.\nerrCde = AdvMot.Acm2_DevConnect(ring_no)\n# Set EtherCAT type as position\necat_type = c_uint(ECAT_ID_TYPE.SUBDEVICE_POS.value)\n# SubDevice position 0 is AMAX-5074\nsub_dev0 = c_uint32(0)\n# SubDevice position 1 is AMAX-5057SO\nsub_dev1 = c_uint32(1)\nget_sub_dev_state0 = c_uint32(0)\nget_sub_dev_state1 = c_uint32(0)\nwhile (get_sub_dev_state0.value != SUB_DEV_STATE.EC_SLAVE_STATE_OP.value) or (get_sub_dev_state1.value != SUB_DEV_STATE.EC_SLAVE_STATE_OP.value):\n # Get AMAX-5074 status\n errCde = AdvMot.Acm2_DevGetSubDeviceStates(ring_no, ecat_type, sub_dev0, byref(get_sub_dev_state0))\n # Get AMAX-5057SO status\n errCde = AdvMot.Acm2_DevGetSubDeviceStates(ring_no, ecat_type, sub_dev1, byref(get_sub_dev_state1))\n time.sleep(0.5)\n```\n\n\n#### Acm2_DevDisConnect\nDisconnect subdevices\n\n```cpp\nU32 Acm2_DevDisConnect(U32 RingNo)\n```\n```python\nimport time\nimport os\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\n# Motion ring number:0, IO Ring number:1, IORing is SM mode only\nring_no0 = c_uint32(0)\nring_no1 = c_uint32(1)\n# Disconnect devices\nerrCde = AdvMot.Acm2_DevDisConnect(ring_no0)\nerrCde = AdvMot.Acm2_DevDisConnect(ring_no1)\n```\n\n\n#### Acm2_DevGetSubDevicesID\nGet subdevices id.\n\n```cpp\nU32 Acm2_DevGetSubDevicesID(U32 RingNo, ECAT_ID_TYPE IDType, PU32 SubDeviceIDArray, PU32 SubDeviceCnt)\n```\n\n\n#### Acm2_DevGetMDeviceInfo\nGet main device information.\n\n```cpp\nU32 Acm2_DevGetMDeviceInfo(U32 RingNo, PADVAPI_MDEVICE_INFO pMDeviceInfo)\n```\n```python\nimport os\nimport time\nimport xml.etree.ElementTree as xml\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\nring_no = c_uint32(1)\nmain_dev_info = ADVAPI_MDEVICE_INFO()\nerrCde = AdvMot.Acm2_DevGetMDeviceInfo(ring_no, byref(main_dev_info))\nprint('slave_count:{0}'.format(main_dev_info.slave_count))\n```\n\n\n#### Acm2_DevGetSubDeviceInfo\nGet subdevice information.\n\n```cpp\nU32 Acm2_DevGetSubDeviceInfo(U32 RingNo, ECAT_ID_TYPE IDType, U32 SubDeviceID, PADVAPI_SUBDEVICE_INFO_CM2 pInfo)\n```\n```python\nimport os\nimport time\nimport xml.etree.ElementTree as xml\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\nring_no = c_uint32(1)\n# Get subdevice ID\nid_type = c_uint(ECAT_ID_TYPE.SUBDEVICE_ID.value)\nid_cnt = c_uint32(3)\nphys_addr_arr = [0] * id_cnt.value\nsub_dev_info_arr = (ADVAPI_SUBDEVICE_INFO_CM2*2)()\nid_arr = (c_uint32 * id_cnt.value)()\nerrCde = AdvMot.Acm2_DevGetSubDevicesID(ring_no, id_type, id_arr, byref(id_cnt))\nif os.name == 'nt':\n tree = xml.parse('test\\\\eni1.xml')\nelse:\n tree = xml.parse('test/eni1.xml')\nidx = 0\n# Check value from xml\nfor subdev in tree.findall('.//Slave'):\n phys_addr = int(subdev.find('Info/PhysAddr').text)\n phys_addr_arr[idx] = phys_addr\n idx += 1\nfor i in range(id_cnt.value):\n sub_dev_info = ADVAPI_SUBDEVICE_INFO_CM2()\n errCde = AdvMot.Acm2_DevGetSubDeviceInfo(ring_no, c_uint(ECAT_ID_TYPE.SUBDEVICE_POS.value), i, byref(sub_dev_info))\n```\n\n\n#### Acm2_DevGetSubDeviceFwVersion\nGet subdevice fw information.\n\n```cpp\nU32 Acm2_DevGetSubDeviceFwVersion(U32 RingNo, ECAT_ID_TYPE IDType, U32 SubDeviceID, OUT char *VersionInfo)\n```\n\n\n#### Acm2_DevSetSubDeviceID\nSet subdevice id.\n\n```cpp\nU32 Acm2_DevSetSubDeviceID(U32 RingNo, ECAT_ID_TYPE IDType, U32 SubDeviceID, U32 SubDeviceNewID)\n```\n\n\n#### Acm2_DevSetSubDeviceStates\nSet subdevice status.\n\n```cpp\nU32 Acm2_DevSetSubDeviceStates(U32 RingNo, ECAT_ID_TYPE IDType, U32 SubDeviceID, U32 SubDeviceState)\n```\n\n\n#### Acm2_DevGetSubDeviceStates\nGet subdevice states.\n\n```cpp\nU32 Acm2_DevGetSubDeviceStates(U32 RingNo, ECAT_ID_TYPE IDType, U32 SubDeviceID, PU32 SubDeviceState)\n```\n```python\nimport os\nimport time\nimport xml.etree.ElementTree as xml\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\n# eni file can be create by the Utility\nif os.name == 'nt':\n eni_path = b'test\\\\eni1.xml'\nelse:\n eni_path = b'test/eni1.xml'\n# Motion ring number:0, IO Ring number:1, IORing is SM mode only\nring_no = c_uint32(1)\nerrCde = AdvMot.Acm2_DevLoadENI(ring_no, eni_path)\n# After load eni file, StartFieldbus/Connect to subdevices.\nerrCde = AdvMot.Acm2_DevConnect(ring_no)\n# Set EtherCAT type as position\necat_type = c_uint(ECAT_ID_TYPE.SUBDEVICE_POS.value)\n# SubDevice position 0 is AMAX-5074\nsub_dev0 = c_uint32(0)\n# SubDevice position 1 is AMAX-5057SO\nsub_dev1 = c_uint32(1)\nget_sub_dev_state0 = c_uint32(0)\nget_sub_dev_state1 = c_uint32(0)\nwhile (get_sub_dev_state0.value != SUB_DEV_STATE.EC_SLAVE_STATE_OP.value) or (get_sub_dev_state1.value != SUB_DEV_STATE.EC_SLAVE_STATE_OP.value):\n # Get AMAX-5074 status\n errCde = AdvMot.Acm2_DevGetSubDeviceStates(ring_no, ecat_type, sub_dev0, byref(get_sub_dev_state0))\n # Get AMAX-5057SO status\n errCde = AdvMot.Acm2_DevGetSubDeviceStates(ring_no, ecat_type, sub_dev1, byref(get_sub_dev_state1))\n time.sleep(0.5)\n```\n\n\n#### Acm2_DevWriteSDO\nWrite data by SDO.\n\n```cpp\nU32 Acm2_DevWriteSDO(IN U32 RingNo, ECAT_ID_TYPE IDType, IN U32 SubDeviceID, IN U32 Index, IN U32 SubIndex, IN U32 Type, IN U32 DataSize, IN VOID *pValue)\n```\n\n\n#### Acm2_DevReadSDO\nRead data by SDO.\n\n```cpp\nU32 Acm2_DevReadSDO(IN U32 RingNo, ECAT_ID_TYPE IDType, IN U32 SubDeviceID, IN U32 Index, IN U32 SubIndex, IN U32 Type, IN U32 DataSize, OUT VOID *pValue)\n```\n\n\n#### Acm2_DevWritePDO\nWrite data by PDO.\n\n```cpp\nU32 Acm2_DevWritePDO(IN U32 RingNo, ECAT_ID_TYPE IDType, IN U32 SubDeviceID, IN U32 Index, IN U32 SubIndex, IN U32 Type, IN U32 DataSize, IN VOID *pValue)\n```\n\n\n#### Acm2_DevReadPDO\nRead data by PDO.\n\n```cpp\nU32 Acm2_DevReadPDO(IN U32 RingNo, ECAT_ID_TYPE IDType, IN U32 SubDeviceID, IN U32 Index, IN U32 SubIndex, IN U32 Type, IN U32 DataSize, OUT VOID *pValue)\n```\n```python\nimport os\nimport time\nimport xml.etree.ElementTree as xml\nfrom ctypes import *\nfrom AcmP.AdvCmnAPI_CM2 import AdvCmnAPI_CM2 as AdvMot\nfrom AcmP.AdvMotApi_CM2 import *\nfrom AcmP.AdvMotDrv import *\nfrom AcmP.AdvMotPropID_CM2 import PropertyID2\n\ndev_list = (DEVLIST*10)()\nout_ent = c_uint32(0)\nerrCde = c_uint32(0)\n# Get Available\nerrCde = AdvMot.Acm2_GetAvailableDevs(dev_list, 10, byref(out_ent))\n# Initial device\nerrCde = AdvMot.Acm2_DevInitialize()\n\n# Ring as IO Ring\nring_no = c_uint32(1)\n# set by position\nid_type = c_uint(ECAT_ID_TYPE.SUBDEVICE_POS.value)\nsub_dev_pos = c_uint32(1)\n# AMAX-5057SO 0x3101:01 is DO(0)\npdo_idx = c_uint32(0x3101)\npdo_sub_idx = c_uint32(0x01)\n# DO(0) data type is boolean\npdo_type = c_uint32(ECAT_TYPE.ECAT_TYPE_BOOL.value)\npdo_data_size = c_uint32(sizeof(c_bool))\nval_on = c_bool(1)\nval_off = c_bool(0)\nget_value = c_bool(0)\n# Set DO(0) on by PDO\nerrCde = AdvMot.Acm2_DevWritePDO(ring_no, id_type, sub_dev_pos, pdo_idx, pdo_sub_idx, pdo_type, pdo_data_size, byref(val_on))\n# Get DO(0) value by PDO\nerrCde = AdvMot.Acm2_DevReadPDO(ring_no, id_type, sub_dev_pos, pdo_idx, pdo_sub_idx, pdo_type, pdo_data_size, byref(get_value))\n# Set DO(0) off by PDO\nerrCde = AdvMot.Acm2_DevWritePDO(ring_no, id_type, sub_dev_pos, pdo_idx, pdo_sub_idx, pdo_type, pdo_data_size, byref(val_off))\n# Get DO(0) value by PDO\nerrCde = AdvMot.Acm2_DevReadPDO(ring_no, id_type, sub_dev_pos, pdo_idx, pdo_sub_idx, pdo_type, pdo_data_size, byref(get_value))\n```\n\n\n#### Acm2_DevWriteReg\nWrite data by reg.\n\n```cpp\nU32 Acm2_DevWriteReg(IN U32 RingNo, ECAT_ID_TYPE IDType, IN U32 SubDeviceID, IN U32 Address, IN U32 Type, IN U32 DataSize, IN VOID *pValue)\n```\n\n\n#### Acm2_DevReadReg\nRead data by reg.\n\n```cpp\nU32 Acm2_DevReadReg(IN U32 RingNo, ECAT_ID_TYPE IDType, IN U32 SubDeviceID, IN U32 Address, IN U32 Type, IN U32 DataSize, OUT VOID *pValue)\n```\n\n\n#### Acm2_DevReadSubDeviceCommErrCnt\nRead subdevice communication error counter.\n\n```cpp\nU32 Acm2_DevReadSubDeviceCommErrCnt(IN U32 RingNo, IN PU32 ErrCntArray, IN PU32 ArrayElements)\n```\n\n\n#### Acm2_Ax1DCompensateTable\nSet compensate table with one axis.\n\n```cpp\nU32 Acm2_Ax1DCompensateTable(U32 AxID, F64 OriginPos, F64 Pitch, PF64 OffsetData, U32 OffsetElements, U32 Direction)\n```\n\n\n#### Acm2_Ax2DCompensateTable\nSet compensate table in 2D.\n\n```cpp\nU32 Acm2_Ax2DCompensateTable(U32 AxID, U32 RelAxID, F64 OriginPosX, F64 OriginPosY, F64 PitchX, F64 PitchY, PF64 OffsetDataX, PF64 OffsetDataY, U32 OffsetElementsX, U32 OffsetElementsY)\n```\n\n\n#### Acm2_AxZAxisCompensateTable\nSet compensate table in Z axis.\n\n```cpp\nU32 Acm2_AxZAxisCompensateTable(U32 AxID, U32 RelAxID, U32 ZAxID, F64 OriginPosX, F64 OriginPosY, F64 PitchX, F64 PitchY, PF64 OffsetDataZ, U32 OffsetElementsX, U32 OffsetElementsY)\n```\n\n\n#### Acm2_AxGetCompensatePosition\nGet compensate position by axis.\n\n```cpp\nU32 Acm2_AxGetCompensatePosition(U32 AxID, PF64 Position)\n```\n\n\n#### Acm2_DevOscChannelDataStart\nStart Osc. channel data.\n\n```cpp\nU32 Acm2_DevOscChannelDataStart(U32 DevID)\n```\n\n\n#### Acm2_DevOscChannelDataStop\nStop Osc. channel data.\n\n```cpp\nU32 Acm2_DevOscChannelDataStop(U32 DevID)\n```\n\n\n#### Acm2_DevGetOscChannelDataConfig\nGet config of Osc. channel.\n\n```cpp\nU32 Acm2_DevGetOscChannelDataConfig(U32 DevID, U16 ChannelID, POSC_PROFILE_PRM oscflg)\n```\n\n\n#### Acm2_DevSetOscChannelDataConfig\nSet config of Osc. channel.\n\n```cpp\nU32 Acm2_DevSetOscChannelDataConfig(U32 DevID, U16 ChannelID, OSC_PROFILE_PRM oscflg)\n```\n\n\n#### Acm2_DevGetOscChannelData\nGet Osc. channel data.\n\n```cpp\nU32 Acm2_DevGetOscChannelData(U32 DevID, U16 ChannelID, U32 DataIndex, PU32 MaxCount, PF64 DataBuffer)\n```\n\n\n#### Acm2_DevGetOscChannelStatus\nGet Osc. channel status.\n\n```cpp\nU32 Acm2_DevGetOscChannelStatus(U32 DevID, PU32 Status)\n```\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": null, "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "dynamic": null, "home_page": "https://github.com/Michelle-Tsai/ma-advmot2", "keywords": "Advantech, PCIE-1203, PCIE1203", "license": "Apache License 2.0", "maintainer": null, "maintainer_email": null, "name": "AcmP", "package_url": "https://pypi.org/project/AcmP/", "platform": null, "project_url": "https://pypi.org/project/AcmP/", "project_urls": { "Homepage": "https://github.com/Michelle-Tsai/ma-advmot2" }, "provides_extra": null, "release_url": "https://pypi.org/project/AcmP/0.1.2/", "requires_dist": null, "requires_python": null, "summary": "For developers of Advantech PCIE-12xx series access to the AdvMot API.", "version": "0.1.2", "yanked": false, "yanked_reason": null }, "last_serial": 24043020, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "blake2b_256": "6abf81b842e60291e5ab9d9685dbf9f890eae54e6c1f9666ab2bb02055583186", "md5": "2edebd0f846a12bfacfeb0fd5bef4cf5", "sha256": "f810e601b8882453a0f90b11ee2513e20960c1f59532c1cd4c58a06857b8b9c2" }, "downloads": -1, "filename": "AcmP-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "2edebd0f846a12bfacfeb0fd5bef4cf5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27341, "upload_time": "2024-01-29T02:19:47", "upload_time_iso_8601": "2024-01-29T02:19:47.185766Z", "url": "https://files.pythonhosted.org/packages/6a/bf/81b842e60291e5ab9d9685dbf9f890eae54e6c1f9666ab2bb02055583186/AcmP-0.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.0.2": [ { "comment_text": "", "digests": { "blake2b_256": "0faee8eedc5043557a6a427475cf3805ac0af8da3fce3ad9864bf10b41d58e77", "md5": "28c5b36e7fc412d187b47499b42a5199", "sha256": "b6a178c8b6fcd3a2732c90c22efb1f3598864f5d873670eb083070484f10f17a" }, "downloads": -1, "filename": "AcmP-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "28c5b36e7fc412d187b47499b42a5199", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27317, "upload_time": "2024-01-29T02:22:05", "upload_time_iso_8601": "2024-01-29T02:22:05.060509Z", "url": "https://files.pythonhosted.org/packages/0f/ae/e8eedc5043557a6a427475cf3805ac0af8da3fce3ad9864bf10b41d58e77/AcmP-0.0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "blake2b_256": "930b9fe86b2e74e12c1c296142229615e643754329df1dc6a32e53ec6c71b07c", "md5": "ac3ff655c3ff39443e6284f17f6aa79c", "sha256": "f036143f3677088caf97795e972ffef0ceab71916fd073c3fd7e1566138f4bb7" }, "downloads": -1, "filename": "AcmP-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ac3ff655c3ff39443e6284f17f6aa79c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 43920, "upload_time": "2024-07-09T01:28:00", "upload_time_iso_8601": "2024-07-09T01:28:00.148589Z", "url": "https://files.pythonhosted.org/packages/93/0b/9fe86b2e74e12c1c296142229615e643754329df1dc6a32e53ec6c71b07c/AcmP-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "blake2b_256": "930b9fe86b2e74e12c1c296142229615e643754329df1dc6a32e53ec6c71b07c", "md5": "ac3ff655c3ff39443e6284f17f6aa79c", "sha256": "f036143f3677088caf97795e972ffef0ceab71916fd073c3fd7e1566138f4bb7" }, "downloads": -1, "filename": "AcmP-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ac3ff655c3ff39443e6284f17f6aa79c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 43920, "upload_time": "2024-07-09T01:28:00", "upload_time_iso_8601": "2024-07-09T01:28:00.148589Z", "url": "https://files.pythonhosted.org/packages/93/0b/9fe86b2e74e12c1c296142229615e643754329df1dc6a32e53ec6c71b07c/AcmP-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }