3049 字
15 分钟
框架详解 (五):辅助模块、疑难 FAQ 与 API 速查表
专栏系列 第 5 / 5 篇
BoTech 工业自动化框架开发实战
展开查看专栏完整目录(共 5 篇)
WARNING

免责声明:本文章内容仅用于个人学习、技术交流与笔记归档使用。

📑 本篇目录(点击收起 / 展开)

7. ZCM968SOP 控件与方法说明#

本章内容来自 ZCM968SOP 原文,详细说明各 UI 控件的配置与使用方法。 完整控件截图与参数说明请查阅以下官方 PDF 说明书:

控件说明书下载#

文档名称说明操作
ZCM968SOP (英文版)ZCM968 控件全套使用说明(英文,最新版)📖 在线阅读
Zcm2018 SOPZcm2018 系列控件说明书(含中文界面截图)📖 在线阅读
XSation SOPXSation 工站框架控件说明书📖 在线阅读

提示:点击「在线阅读」可直接在浏览器中打开 PDF,支持全文搜索。如需下载,在 PDF 查看器中右键另存即可。


8. Setup_Load.cs 程序启动初始化#

Setup_Load 是程序启动时的初始化入口,由 Frm_Main.Main_Load() 调用。

执行流程#

me_Initial()
├─ 1. 基础状态设置
├─ 2. 加载所有参数 (GetPar)
├─ 3. 初始化 TCP/RS232 通讯
├─ 4. 加载工站 (5 个 Task 初始化)
├─ 5. 加载传送带 (3 条流水线)
├─ 6. 初始化运动控制卡
├─ 7. 绑定 Machine 对象 (事件、IO、灯)
├─ 8. 加载生产数据库
├─ 9. 初始化报警中心
├─ 10. 提升定时器精度
├─ 11. 加载 CCD 相机
└─ 12. 加载数据中心

初始化顺序重要性#

参数加载 → 通讯初始化 → 工站初始化 → 传送带初始化 → 运动卡初始化 → Machine 绑定

注意: Machine 对象的绑定必须在所有 Task 初始化完成之后执行。



9. 机械臂基类开发最佳实践#

在多轴模组(如 X/Y/Z 三轴直角坐标机械臂)开发中,框架底层的 Zcm.Moving 类(即工站中的 pMove 对象)提供了完整的运动控制 API。在开发机械轴任务时,应当根据不同的使用场景(如:常规点位对位、离线对位、带纠偏偏置对位等)灵活选择使用。

9.1 框架底层原生运动控制 API 详解#

在框架底层的 Zcm.Moving 类(即工站中的 pMove 对象)中,提供了若干套底层的阻塞或非阻塞运动控制 API。

9.1.1 原生阻塞型运动 API (WaitDone)#

WaitDone 系列方法会同步阻塞当前工站线程,直到轴运动就位或检测到运动超时报警。

  1. 多轴示教点联动(带 Z 轴安全高度)

    public bool WaitDone(
    int StationNum,
    int PointNum,
    bool MultiAxisSync,
    double ZLiftHeight,
    int PosDelayTime,
    int MaxWaitTime,
    double LowSpeedApproachDist = 0.0,
    double LowSpeedApproachSpeed = 0.0,
    double LowSpeedLiftDist = 0.0,
    double LowSpeedLiftSpeed = 0.0
    )
    • 使用场景:从当前位置安全移动至另一个示教点(例如:从取料位置移动至拍照位置)。
    • 运行逻辑
      1. MultiAxisSynctrue,且 ZLiftHeight(安全抬升高度)设置合理(如 0.0),Z 轴会首先快速上升至 ZLiftHeight
      2. X, Y 等平面轴联动,同步移至目标示教点的 XY 坐标;
      3. 待 XY 轴完全就位后,Z 轴再次下降至该示教点的目标 Z 轴坐标就位。
    • 优点:单行调用,自带防碰撞和 Z 轴优先抬高逻辑。
    • 局限:不支持实时坐标偏置参数(如相机纠偏的 OffsetX/OffsetY)。
  2. 逻辑单轴绝对运动

    public bool WaitDone(ValueType AxisNum, double TargetPos, double Speed, int PosDelayTime, int MaxWaitTime)
    • 使用场景:在知道某个单轴目标坐标时单独移动该轴(例如:Z 轴单独回零后的安全抬升)。
    • 运行逻辑:控制 AxisNum 指定的轴以 Speed(通常传 -1 使用参数配置速度)移动至 TargetPos,并最多等待 MaxWaitTime 毫秒就位。

9.1.2 原生非阻塞型运动 API (StaXYMove 系列)#

如果您需要在示教点的基础坐标上增加相机的对位偏置,且希望自行控制多轴联动的时序,可以使用 StaXYMove 等控制 API。

  • 双轴平移异步偏置运动public bool StaXYMove(ValueType StaID, ValueType PosIndex, double Vel, double OffsetX, double OffsetY)
  • 三轴联移异步偏置运动public bool StaXYRMove(ValueType StaID, ValueType PosIndex, double Vel, double OffsetX, double OffsetY, double OffsetR)
    NOTE

    这些方法仅负责异步下发 XY(R) 轴的定位指令并叠加偏置,并不会自动执行 Z 轴防撞抬起,也不会同步阻塞等待轴到位。



10. 辅助类 API#

本节收录不属于核心运动/工站框架,但在开发中常用的辅助类。

10.1 Zcm.Dialog — 对话框类#

Zcm.Dialog 提供了阻塞弹窗的实现方法。

ReturnData#

功能:根据弹窗的按钮点击后 OKStep 或 NGStep 的值会赋给此属性。

DialogShow()#

重载 A(双按钮):

public bool DialogShow(string MsgStr, string ContinuBtnLabel, string StopBtnLabel,
int OKStep, int NGStep, int 输出编号 = -1, int 输出时间 = -1)

功能:弹窗并阻塞进程。返回值:点击继续按钮 true,点击停止按钮返回 false。

重载 B(单按钮):

public bool DialogShow(string MsgStr, string OKBtnLabel, int OKStep,
int 输出编号 = -1, int 输出时间 = -1)

功能:弹窗并阻塞进程。返回值:点击继续按钮 true。


10.2 Zcm.DoAndDi — IO 操作类#

Zcm.DoAndDi 提供了操作 IO 的各种方法(mDoDi 实例)。

WaitDi()#

重载 A:

public bool WaitDi(ValueType 输入编号, ValueType 需求状态, int 延时时间 = 0, int 超时时间 = 3000)

功能:阻塞并等待输入状态变成需求状态。返回值:在超时时间内被置为需求状态则返回 true,反之则返回 false。

重载 B(带弹窗重试):

public bool WaitDi(ValueType 输入编号, ValueType 需求状态, int 延时时间, int 超时时间, bool 弹窗提示重试 = false)

WaitDone()#

重载 A(输出+等待输入):

public bool WaitDone(ValueType 输出编号, ValueType 输出状态, ValueType 输入编号, ValueType 输入状态,
int 延时时间, int 超时时间, bool 弹窗提示重试 = false)

重载 B(仅等待输入):

public bool WaitDone(ValueType 输入编号, ValueType 需求状态, int 延时时间, int 超时时间, bool 弹窗提示重试 = false)

10.3 Zcm.LanguageHelper — 语言切换#

Zcm.LanguageHelper 提供了切换语言的方法。

SetLanguage()#

public static bool SetLanguage(string language, object form)

功能:设置系统语言选择。返回值:设置成功返回 true,失败则返回 false。



11. 核心 API 常见技巧与 FAQ#

11.1 TasksInteraction 跨线程通信详解#

底层原理#

TasksInteraction 的本质是一个全局线程安全寄存器表,由 SystemMgr 单例管理:

SystemMgr(全局单例,内存中)
├─ 寄存器[0] → bool? 组装允许机械手_标志
├─ 寄存器[1] → bool? 右轴螺丝工作完成_标志
├─ 寄存器[2] → bool? 左轴螺丝工作完成_标志
└─ ...

每个寄存器可以存三个值:

  • null — 从未设置过
  • true — 被设为 true
  • false — 被设为 false

枚举值通过 Convert.ToInt32(id) 转为 int,直接作为寄存器数组的物理索引。


11.2 MainConvId 详解#

MainConvId 是基类 WorkShare 的属性,在 Initialize() 中通过 BindConv() 设置:

public override void Initialize()
{
this.BindConv(1, null); // MainConvId = 1
// ...
}
工位BindConvMainConvId
Task01BindConv(1, null)1
Task02BindConv(2, null)2
Task03BindConv(3, null)3

使用 MainConvId 而不是写死数字,保证代码通用:

// ✅ 通用写法
mFunction.ConveyorData[MainConvId].StartTime
// ❌ 写死数字
mFunction.ConveyorData[1].StartTime

11.3 TipsDialogForm 弹框详解#

AlarmCenter.XAlarmRecord.Instance.TipsDiglogForm(
int taskId, string taskName, string message,
string changeWithoutTran, bool isWaitOne,
string btnOKText, string btnCancelText
)
#参数类型说明
1taskIdint工位ID(用于日志)
2taskNamestring工位名称(用于日志)
3messagestring弹框消息
4changeWithoutTranstring不翻译的变量(多语言用,通常 ""
5isWaitOnebool是否阻塞等待用户点击
6btnOKTextstring确定按钮文字
7btnCancelTextstring取消按钮文字(可选)

返回 AlarmCenter.mDialogResult.OKAlarmCenter.mDialogResult.Cancel

if (AlarmCenter.XAlarmRecord.Instance.TipsDiglogForm(
(int)this.TaskID, this.TaskName,
"是否重试?", "", true, "Yes", "No") == AlarmCenter.mDialogResult.OK)
{
// 用户点了 Yes
}

11.4 扫码/视觉复选框使能检查防呆设计#

AutoRun 状态机处理扫码或相机对位前,必须通过 mGlobal.FuncCheck(FuncChk.xxx) 对功能使能复选框进行防御性检查:

case (int)步序.检查使能并扫码:
if (mGlobal.FuncCheck(FuncChk.启用扫码) && !mGlobal.FlowLineMode)
{
SetStep(ref StaInfo, (int)步序.触发扫码, true);
}
else
{
AddLog("扫码功能被禁用或处于过料模式,跳过扫码", LogsType.Barcode, StaInfo.StepIdx, true);
SetStep(ref StaInfo, (int)步序.关光源放行, true); // 防呆跳步
}
break;

在实际流水线到位判定中,通常需要在两个场景下进行使能检查:

// 场景一:Step10 处理"产品已在位"(设备复位或重启场景)
if (mGlobal.ReadDi_Bool(InNo.流线1到位信号))
{
if (mGlobal.FuncCheck(FuncChk.启用扫码)) { SetStep(ref StaInfo, (int)步序.电机停扫码, true); }
else { SetStep(ref StaInfo, (int)步序.关光源放行, true); }
}
// 场景二:Step20 处理"产品刚到达"(正常流动流程)
if (mDoDi.WaitDi(InNo.流线1到位信号, 1))
{
if (mGlobal.FuncCheck(FuncChk.启用扫码)) { SetStep(ref StaInfo, (int)步序.电机停扫码, true); }
else { SetStep(ref StaInfo, (int)步序.关光源放行, true); }
}
NOTE

设计考量:Step10 用于处理热启动时治具已在工位上的断点续跑,Step20 用于处理正常流水线移交。两个阶段均进行使能判断,确保无论何种工况均不会发生死锁或漏动作。


11.5 核心 API 快速导航表#

为避免篇幅冗余,常见核心 API 的详细原理与最佳实践代码分布在以下对应章节中:

核心 API / 技术主题详细原理与代码示例导航链接
TasksInteraction 跨线程协同握手详见 3.5.3 TasksInteraction 软交互信号量状态详解与使用指南
mSend.WaitDone TCP/串口网络收发详见 3.4.3 TCP 双向应答最佳实践示例6.7.4 工业级 CCD 视觉扫码与拍照通信标准开发 SOP
mDoDi.WaitDone 气缸/IO动作等待详见 4.6 mDoDi / mDoDiS — 数字 IO 等待与简化版
mFunction.OverTime 非阻塞超时判定详见 3.2.2 mFunction.OverTime 超时处理6.4 超时计时器重置与防虚警防呆逻辑
流水线死锁排查与拓扑配置详见 5.11 传送带死锁排查 SOP 与三大致命根因剖析
机械轴屏蔽模式 (是否屏蔽)详见 2.7.2 机械手关闭屏蔽机制
系统 5 大运行模式与脱机仿真详见 2.9 系统 5 大运行模式与多层控制原理6.8 脱机空跑(虚拟仿真)实现 SOP


12. API 速查表#

以下为常用 API 的快速索引,详细参数请参阅对应章节。

Motion & mFunction#

方法说明
GetTickCount()获取当前时间戳
OverTime(start, timeout)超时判断
Sleep(DT)延时(手动模式用)
ReadXml(path, ref data)读取 XML
WriteXml(path, ref data)写入 XML
ReadPosData(path, ref data)读取点位
CreatePath(path)创建文件夹
IsFileExist(path)判断文件存在
TcpLoad(count, start)加载 TCP
SetSpeedRatio(ratio)设置速度比例

MotionDll#

方法说明
ReadDi(index)读取输入
ReadDo(index)读取输出
DoSet(index)置位输出
DoReset(index)复位输出
WriteDo(index, value)写入输出
AxisStop(id, option)轴停止
mAxisOn(id) / mAxisOff(id)使能开/关
ZSPD(id)运动到位
SetStep(ref sta, step, time)步序控制

TaskBase IMotion#

方法说明
MotionAbsMove(...)绝对运动
MotionRelMove(...)相对运动
MotionAbsMoveAndDone(...)绝对运动并等待
MotionWaitMoveDone(...)等待运动完成
MotionGoHome(...)回零
MotionWaitDi(...)等待输入
MotionZSPD(id)运动到位

WkManager#

方法说明
BindStation(id, name, obj)绑定工站
Start(mode, freq)全部启动
Stop() / Pause() / Resume()停止/暂停/恢复
Reset(mode)全部复位
FindTaskById(id)查找工站
TaskStart(id, mode)单站启动
ConvSet(start, step, count)流水线设置

WorkShare 子对象#

对象常用方法说明
mHomeGoHome, GoHomeAndDone回零
pMoveAbsMove, WaitDone, Stop单轴运动
mMoveAbsMove, AbsMoveAndDone多轴运动
mDoDiWaitDone, WaitDiIO 等待
mSendWaitDone, GetData通讯收发

GTMultiAxialMotion#

方法说明
AxisPoints(axisId, points[], encMm)轴点位插补包装类
Line2D(axis1, axis2, speed)二维直线插补
Line3D(axis1, axis2, axis3, speed)三维直线插补
Line4D(axis1, axis2, axis3, axis4, speed)四维直线插补
FollowAxisSetup(...)Follow 模式轨迹跟随设置
GearAxisSetup(...)电子齿轮比例协同设置
SlaveStop(slaveAxisId)停止从轴跟随运动

专栏目录导航 · BoTech 工业自动化框架开发实战
5 / 5
框架详解 (五):辅助模块、疑难 FAQ 与 API 速查表
https://meteor-comet.github.io/posts/framework-05-faq-and-cheat-sheet/
作者
Comet
发布于
2026-06-06
许可协议
CC BY-NC-SA 4.0