Dobot Magicial 用 DobotDll32.pas 2020/03/12~2020/07/28
・2020/03/18 使用例に Dobot 接続、切断を追加
・2020/07/28 DobotDll ラッパーのリンクを追加
■DobotDll を Delphi で使うユニットです。
下の方に、コメントアウトしたコマンド終了待ちのサンプルコードがあります。
■ダウンロード
dobotDll3.pas(拡張子が変わることがあります。)
※最近見つけた「DoboDllラッパー」。こちらの方が上級者っぽい。
https://github.com/norgepaul/DelphiDobotAPI
{ DobotDll32.pas + Delphi サンプル EXE と同じフォルダに下記 DLL が必要 ・DobotDll.dll (32bit) ・Qt5Core.dll ・Qt5Network.dll ・Qt5SerialPort.dll } unit DobotDll32; interface uses Winapi.Windows; // for Dobot ******************************************************************* type TKinematics = packed record velocity: single; acceleration: single; end; TPTPCommonParams = packed record velocityRatio : single; accelerationRatio : single; end; TPTPCoordinateParams = packed record xyzVelocity : single; rVelocity : single; xyzAcceleration : single; rAcceleration : single; end; TPTPJointParams = packed record velocity : array [0..3] of single; acceleration : array [0..3] of single; end; TPTPJumpParams = packed record jumpHeight : single; maxJumpHeight : single; // Z Limit end; TPTPCmd = packed record ptpMode : Byte; x : single; y : single; z : single; r : single; end; THOMEParams = packed record x : single; y : single; z : single; r : single; end; THOMECmd = packed record rserved : Uint32; // = Cardinal end; TEndEffectorParams = packed record xBias : single; yBias : single; zBias : single; end; TWAITCmd = packed record timeout : Uint32; // Unit ms end; TPose = packed record x : single; y : single; z : single; r : single; jointAngle : array [0..3] of single; end; TJOGJointParams = packed record velocity : array [0..3] of single; acceleration : array [0..3] of single; end; TJOGCoordinateParams = packed record velocity : array [0..3] of single; acceleration : array [0..3] of single; end; TJOGCommonParams = packed record velocityRatio : single; accelerationRatio : single; end; TJOGCmd = packed record isJoint : Byte; cmd : Byte; end; TCPParams = packed record planAcc: Single; juncitionVel: Single; acc: Single; realTimeTrack: Byte; end; TContinuousPathMode = ( CPRelativeMode, CPAbsoluteMode ); TCPCmd = packed record cpMode: Byte; x: Single; y: Single; z: Single; velocity: Single; end; TIOFunction = ( IOFunctionDummy, IOFunctionDO, IOFunctionPWM, IOFunctionDI, IOFunctionADC ); TIOMultiplexing = packed record address: Byte; multiplex: Byte; end; TIODO = packed record address : Byte; level : Byte; end; TIOPWM = packed record address: Byte; frequency: single; dutyCycle: single; end; TIODI = packed record address: Byte; level: Byte; end; TIOADC = packed record address: Byte; value: UInt16; end; { TPTPMode = ( JUMP_XYZ, MOVJ_XYZ, MOVL_XYZ, JUMP_ANGLE, MOVJ_ANGLE, MOVL_ANGLE, MOVJ_INC, MOVL_INC, MOVJ_XYZ_INC, JUMP_MOVL_XYZ ); } // Win32 はこちらが正解みたい TPTPMode = ( JUMP_XYZ, MOVJ_XYZ, MOVL_XYZ, JUMP_ANGLE, MOVJ_ANGLE, MOVL_ANGLE, MOVJ_INC, MOVL_INC ); TJOGMode = ( IDEL, //Invalid status AP_DOWN, // X+/Joint1+ AN_DOWN, // X-/Joint1- BP_DOWN, // Y+/Joint2+ BN_DOWN, // Y-/Joint2- CP_DOWN, // Z+/Joint3+ CN_DOWN, // Z-/Joint3- DP_DOWN, // R+/Joint4+ DN_DOWN // R-/Joint4- ); TJOGModel = (COORDINATE_MODEL, JOINT_MODEL); TARCParams = packed record xyzVelocity : single; rVelocity : single; xyzAcceleration : single; rAcceleration : single; end; TARCCmd = packed record arcPointX : single; arcPointY : single; arcPointZ : single; arcPointR : single; toPointX : single; toPointY : single; toPointZ : single; toPointR : single; end; // ***************************************************************************** // DobotDll.dll (32bit) function ConnectDobot(portName: PAnsiChar ; baudrate: Uint32; fwType: PAnsiChar ; version: PAnsiChar ): Int32; stdcall; external 'DobotDll.dll'; function DisconnectDobot(): Uint32; stdcall; external 'DobotDll.dll'; // ???? function SearchDobot(dobotList: PAnsiChar; maxLen: UInt32): Int32; stdcall; external 'DobotDll.dll'; function DobotExec(): Int32; stdcall; external 'DobotDll.dll'; function SetCmdTimeout(cmdTimeout: UInt32): Int32; stdcall; external 'DobotDll.dll'; // Queued command control function SetQueuedCmdStartExec(): Int32; stdcall; external 'DobotDll.dll'; function SetQueuedCmdStopExec(): Int32; stdcall; external 'DobotDll.dll'; function SetQueuedCmdForceStopExec(): Int32; stdcall; external 'DobotDll.dll'; function SetQueuedCmdStartDownload(totalLoop: UInt32; linePerLoop: UInt32): Int32; stdcall; external 'DobotDll.dll'; function SetQueuedCmdStopDownload(): Int32; stdcall; external 'DobotDll.dll'; function SetQueuedCmdClear(): Int32; stdcall; external 'DobotDll.dll'; function GetQueuedCmdCurrentIndex(var executedCmdIndex: Uint64): Int32; stdcall; external 'DobotDll.dll'; // SN information function GetDeviceSN(deviceSN: PAnsiChar; maxLen: UInt32): Int32; stdcall; external 'DobotDll.dll'; // Device information function SetDeviceName(deviceName: PAnsiChar): Int32; stdcall; external 'DobotDll.dll'; function GetDeviceName(deviceName: PAnsiChar; maxLen: Uint32): Int32; stdcall; external 'DobotDll.dll'; // public static?extern functions function SetEndEffectorParams(var endEffectorParams: TEndEffectorParams; var isQueued: Bool; queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetEndEffectorParams(var endEffectorParams: TEndEffectorParams): Int32; stdcall; external 'DobotDll.dll'; function SetEndEffectorLaser(enableCtrl: Bool; isOn: Bool; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetEndEffectorLaser(var isCtrlEnabled: Bool; var isOn:Bool): Int32; stdcall; external 'DobotDll.dll'; function SetEndEffectorSuctionCup(enableCtrl: Bool; suck: Bool; isQueued: Bool; var queuedCmdIndex: Uint64): Int32; stdcall; external 'DobotDll.dll'; function GetEndEffectorSuctionCup(var isCtrlEnabled: Bool; var isSucked: Bool): Int32; stdcall; external 'DobotDll.dll'; function SetEndEffectorGripper(enableCtrl: Bool; grip: Bool; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetEndEffectorGripper(var isCtrlEnabled: Bool; var isGripped: Bool): Int32; stdcall; external 'DobotDll.dll'; // InitialPose function ResetPose(manual: Bool; rearArmAngle: Single; frontArmAngle: Single): Int32; stdcall; external 'DobotDll.dll'; // Pose and Kinematics parameters are automatically get function GetPose(var pose: TPose): Int32; stdcall; external 'DobotDll.dll'; function GetKinematics(var kinematics: TKinematics): Int32; stdcall; external 'DobotDll.dll'; function GetPoseL(var l: single): Int32; stdcall; external 'DobotDll.dll'; // HOME function SetHOMEParams(var homeParams: THOMEParams; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetHOMEParams(var homeParams: THOMEParams): Int32;stdcall; external 'DobotDll.dll'; function SetHOMECmd(var homeCmd: THOMECmd; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; // Jog functions function SetJOGJointParams(var jointJogParams: TJOGJointParams; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetJOGJointParams(var jointJogParams: TJOGJointParams): Int32; stdcall; external 'DobotDll.dll'; function SetJOGCoordinateParams(var coordinateJogParams: TJOGCoordinateParams; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetJOGCoordinateParams(var coordinateJogParams: TJOGCoordinateParams): Int32; stdcall; external 'DobotDll.dll'; function SetJOGCommonParams(var jogCommonParams: TJOGCommonParams; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetJOGCommonParams(var jogCommonParams: TJOGCommonParams): Int32; stdcall; external 'DobotDll.dll'; function SetJOGCmd(var jogCmd: TJogCmd; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; // PTP functions function SetPTPJointParams(var ptpJointParams : TPTPJointParams; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetPTPJointParams(var ptpJointParams: TPTPJointParams): Int32; stdcall; external 'DobotDll.dll'; function SetPTPCoordinateParams(var ptpCoordinateParams: TPTPCoordinateParams; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetPTPCoordinateParams(var ptpCoordinateParams: TPTPCoordinateParams): Int32; stdcall; external 'DobotDll.dll'; function SetPTPJumpParams(var ptpJumpParams: TPTPJumpParams; isQueued: Boolean; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetPTPJumpParams(var ptpJumpParams: TPTPJumpParams): Int32; stdcall; external 'DobotDll.dll'; function SetPTPCommonParams(var ptpCommonParams: TPTPCommonParams; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetPTPCommonParams(var ptpCommonParams: TPTPCommonParams): Int32; stdcall; external 'DobotDll.dll'; function SetPTPCmd(var ptpCmd: TPTPCmd; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; // CP functions function SetCPParams(var cpParams: TCPParams; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetCPParams(var cpParams: TCPParams): Int32; stdcall; external 'DobotDll.dll'; function SetCPCmd(var cpCmd: TCPCmd; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; // WAIT function SetWAITCmd(var waitCmd: TWAITCmd; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; // EIO function SetIOMultiplexing(var ioMultiplexing: TIOMultiplexing; isQueued: Bool; var queuedCmdIndex: Uint64): Int32; stdcall; external 'DobotDll.dll'; function GetIOMultiplexing(var ioMultiplexing: TIOMultiplexing): Int32; stdcall; external 'DobotDll.dll'; function SetIODO(var ioDO: TIODO; isQueued: Bool; var queuedCmdIndex: uint64): Int32; stdcall; external 'DobotDll.dll'; function GetIODO(var ioDO: TIODO): Int32; stdcall; external 'DobotDll.dll'; function SetIOPWM(var ioPWM : TIOPWM; isQueued: Bool;var queuedCmdIndex: uint64): Int32; stdcall; external 'DobotDll.dll'; function GetIOPWM(var ioPWM: TIOPWM): Int32; stdcall; external 'DobotDll.dll'; function GetIODI(var ioDI: TIODI): Int32; stdcall; external 'DobotDll.dll'; function GetIOADC(var ioADC: TIOADC): Int32; stdcall; external 'DobotDll.dll'; // Alarm function GetAlarmsState(var alarmsState: Byte; var len: UInt32; maxLen: UInt32): Int32; stdcall; external 'DobotDll.dll'; function ClearAllAlarmsState: Int32; stdcall; external 'DobotDll.dll'; // Arc function SetARCParams(var arcParams: TARCParams; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; function GetARCParams(var arcParams: TARCParams): Int32; stdcall; external 'DobotDll.dll'; function SetARCCmd(var arcCmd: TARCCmd; isQueued: Bool; var queuedCmdIndex: UInt64): Int32; stdcall; external 'DobotDll.dll'; // ***************************************************************************** implementation // ----------------------------------------------------------------------------- // Dobot Exsamples // ----------------------------------------------------------------------------- { procedure TForm5.SpeedButton11Click(Sender: TObject); // Dobot 接続 var ret1 : integer; fwType, version, deviceSN: array [0..63] of AnsiChar; x, y, z, r: single; begin IsDobotConnected := false; // fwType は省略不可, version は nil で省略可 ret1 := ConnectDobot('', 115200, fwType, version);//nil); if ret1 = 0 then begin if GetDeviceSN(deviceSN, 64) = 0 then begin x := 200; y := 0; z := 0; r := 0; if dobotSetHomeParams(x, y, z, r) then begin IsDobotConnected := true; end; end; end; end; procedure TForm5.SpeedButton12Click(Sender: TObject); // Dobot 切断 begin DisconnectDobot(); IsDobotConnected := False; end; function movePTP(x, y, z, r: single): boolean; var Pose: TPose; PTPCmd: TPTPCmd; queuedCmdIndex : Uint64; executedCmdIndex : UInt64; ret : integer; begin result := False; executedCmdIndex := 0; if IsDobotConnected then begin PTPCmd.ptpMode := (Ord(MOVL_XYZ)); PTPCmd.x := x; PTPCmd.y := y; PTPCmd.z := z; PTPCmd.r := r; ret := SetPTPCmd(PTPCmd, True, queuedCmdIndex); if ret = 0 then begin // 完了待ち while (executedCmdIndex < queuedCmdIndex) do begin GetQueuedCmdCurrentIndex(executedCmdIndex); GetPose(pose); //Form4.Memo1.Lines.Add(Format('x = %f, y = %f, z = %f, r = %f',[pose.x, pose.y, pose.z, Pose.r])); Form4.Edit31.Text := Format('%.2f',[pose.x]); Form4.Edit32.Text := Format('%.2f',[pose.y]); Form4.Edit33.Text := Format('%.2f',[pose.z]); Form4.Edit34.Text := Format('%.2f',[pose.jointAngle[0]]); end; GetPose(pose); //Form4.Memo1.Lines.Add(Format('x = %f, y = %f, z = %f, r = %f',[pose.x, pose.y, pose.z, Pose.r])); Form4.Edit31.Text := Format('%.2f',[pose.x]); Form4.Edit32.Text := Format('%.2f',[pose.y]); Form4.Edit33.Text := Format('%.2f',[pose.z]); Form4.Edit34.Text := Format('%.2f',[pose.jointAngle[0]]); Form4.Memo1.Lines.Add('>> move PTP End <<'); result := True; end; end; end; function moveArc(arcX, arcY, arcZ, arcR, toX, toY, toZ, toR: single): boolean; var pose : TPose; arcCmd : TARCCmd; queuedCmdIndex : UInt64; executedCmdIndex : UInt64; ret : integer; begin result := False; executedCmdIndex := 0; if IsDobotConnected then begin // Z も円弧状態で動く arcCmd.arcPointX := arcX; arcCmd.arcPointY := arcY; arcCmd.arcPointZ := arcZ; arcCmd.arcPointR := arcR; arcCmd.toPointX := toX; arcCmd.toPointY := toY; arcCmd.toPointZ := toZ; arcCmd.toPointR := toR; ret := SetARCCmd(arcCmd, true, queuedCmdIndex); if ret = 0 then begin // 完了待ち while (executedCmdIndex < queuedCmdIndex) do begin GetQueuedCmdCurrentIndex(executedCmdIndex); GetPose(pose); Form4.Memo1.Lines.Add(Format('x = %f, y = %f, z = %f, r = %f', [pose.x, pose.y, pose.z, Pose.r])); end; Form4.Memo1.Lines.Add('>> move ARC End <<'); result := True; end; end; end; function setSuctionCup(onFlag : boolean): boolean; // SuctionCup ON / OFF var suck : LongBool; queuedCmdIndex : Uint64; ret : integer; begin result := False; suck := onFlag; queuedCmdIndex := 0; if IsDobotConnected then begin ret := SetEndEffectorSuctionCup(true, suck, true, queuedCmdIndex); result := ret = 0; end; end; } end.