LMCV4-FIBER-M
JCZ LMCV4-FIBER-M is a fiber galvo type laser controlled by ezcad.
Reverse engineering
The reverse engineering of the product has been done (at least initially) https://www.bryce.pw/engraver.html
Commandcodes appear to be 2 bytes long starting either with 00 or 80 depending on whether it's a single command or a list command.
command codes
The command codes appear to be:
0x800d is called in listJumpTo
0x8001 is called in listJumpTo
0x8005 is called in listMarkTo
0x8003 is called in listLaserOnPoint
0x8006 is called in listJumpSpeed
0x800c is called in listMarkSpeed
0x801b is called in listMarkFreq (if lasertype == 3)
0x800a is called in listMarkFreq (if lasertype == 4)
0x800b is called in listMarkFreq (if lasertype == 4 and 0x800a returned 0).
0x8013 is called in listMarkFreq (if some_setting2 == 0)
0x800a is called in listMarkFreq (if some_setting3 != 0)
0x8012 is called in listMarkPowerRatio
0x800b is called in listMarkPowerRatio (if lasertype == 0 (CO2))
0x800b is called in listMarkPulseWidth
0x8026 is called in listIPGYLPMPulseWidth
0x8007 is called in listLaserOnDelay
0x8008 is called in listLaserOffDelay
0x800f is called in listPolygonDelay
0x8004 is called in listMarkEndDelay
0x8004 is called in listDelayTime
0x8004 is called in listDelayTimeUs
0x8002 is called in listEndofList
0x801a is called in listFlyEnable
0x801d is called in listFlyDelay
0x8011 is called in listWritrPort
0x8051 is called in ReadyMark
0x8002 is called in Run.
0x801c is called in listDirectLaserSwitch
0x801e is called in SetCo2FPK
0x8005 is called in listDirectMarkTo
0x801f is called in lsFlyWaitInput
0x8021 is called in listIPGOpenMO
0x8023 is called in listChangeMarkCount
0x8022 is called in listWaitForInput
0x8026 is called in listIPGSetConfigExtend
0x8028 is called in listFlyEncoderCount
0x8029 is called in listSetDaZWord (if this returns 0, listDelayTime is called)
0x8050 is called in listJptSetParam
0x8025 is called in listEnableWeldPowerWave
0x8024 is called in listSetWeldPowerWave
0x8006 is called in ScanBmpPtBuf (several times)
DisableLaser 0x2 -- all zero
EnableLaser 0x4 -- all zero
ExecuteList 0x5 -- all zero
GetVersion 0x7 -- 1, 0 0 0
GetSerialNo 0x9 -- all zero
GetListStatus 0xa -- all zero
GetPositionXY 0xc -- all zero
GotoXY 0xd -- variable, stack value, 0 0
LaserSignalOff 0xe -- all zero
LaserSignalOn 0xf -- all zero
SetAxisMotionParam 0x26 -- variable, stack value, 0 0
MoveAxisTo 0x29 -- lower 8 bits, 16-24th bits specified by single variable, 0, 0
AxisGoOrigin 0x28 -- variable, 0, 0, 0
GetAxisPos 0x2a -- stack value, 0, 0, 0
SetAxisOriginParam 0x27 -- variable, stack value, 0 0
WriteCorTable 0x15 -- boolean, 0, 0, 0
ResetList 0x12 -- all zero
RestartList 0x13 -- all zero
SetControlMode 0x16 -- stack value, 0, 0, 0
SetDelayMode 0x17 -- stack value, 0, 0, 0
SetMaxPolyDelay 0x18 -- stack value, 0, 0, 0
SetEndOfList 0x19 -- all zero
SetFirstPulseKiller 0x1a -- stack value, 0, 0, 0
SetTiming 0x1c -- stack value, 0, 0, 0
SetPwmHalfPeriod 0x1e -- stack value, 0, 0, 0
SetPwmPulseWidth 0x6 -- stack value, 0, 0, 0
SetLaserMode 0x1b -- stack value, 0, 0, 0
SetStandby 0x1d -- variable, variable, stack value, 0
StopExecute 0x1f -- all zero
StopList 0x20 -- all zero
ReadPort 0x25 -- all zero
WritePort 0x21 - variable, stack value, 0, 0
WriteAnalogPort1 0x22 -- stack value, 0, 0, 0
WriteAnalogPort2 0x23 -- 0, stack value, 0, 0 (stack value is 2nd)
WriteAnalogPortX 0x24 -- variable, stack value, 0
SetFpkParam 0x62 -- variable, variable, variable, stack_value
SetFpkParam2 0x2e -- variable, variable, variable, stack_value
IPG_OpemMO 0x33 -- stack value, 0, 0, 0
IPG_GETStMO_AP 0x34 -- all zero
ENABLEZ 0x3a or 0x39 (if a value is zero) -- all zero
SETZDATA 0x3b variable, stack value, 0 0
SetSPISimmerCurrent 0x3c -- variable, stack_value
GetFlyWaitCount 0x2b -- boolean, 0, 0, 0
GetMarkCount 0x2d -- boolean, 0, 0, 0
And additionally there are calls to a couple different IO events:
MIO_Cmd uses the dwIoControlCode 0x99982014
MIO_GetState uses: 0x99982010
MIO_NewCmd uses: 0x99982024
MIO_Reset uses: 0x99982008
MIO_WriteCmdBuf uses: 0x99982018
MIO_TransferDataZ uses: 0x99982020
MIO_ReadEpprom uses: 0x99982080
MIO_ReadAllEpprom uses: 0x99982090
MIO_ModifyEpprom uses: 0x99982088
MIO_EarseEpprom(sic) uses: 0x9998208c
MIO_WriteEpprom uses: 0x99982084
MIO_EppromSetMark uses: 0x99982094
MIO_EppromGetMark uses: 0x99982098
MIO_EppromSetTimeStamp uses: 0x9998209c
MIO_Verify uses: 0x99982028
MIO_WriteNxp uses: 0x999820c0
MIO_ReadNxp uses: 0x999820c4
External Links
- https://www.bryce.pw/engraver.html - Bryce Schroeder's work on reverse engineering the board
- https://charliex2.wordpress.com/2020/01/31/fibre-laser-arrives-let-the-games-begin/ -- Fantastic blog post on setting up a dummy dll