最近在整理硬盘翻出个老项目——C#写的3C运动控制框架。这玩意儿当年在半导体车间扛过五年大旗,新能源产线也用过几回,今天给大伙儿拆解下里面的门道
C#3C运动控制软件框架,A项目标准界面,用于半导体,新能源等项目,用了5年项目框架。 包含三级权限,SQL数据操作.集成MES WebService服务调用方法。 选择轴的个数可以自定义,某个就成用到的轴也可以自定义,窗体使用模块化调用方式,集成EtherCAT adlik 833X 204 208C控制卡,研华Advtech控制卡,基恩士点 线laser调用库。 轴控制使用快捷键 Ctrl+A D W S来控制轴运动方向,流水线软件写法,等等功能,可直接打开运行,数据库文件也在目录下,还原即可登录,密码为111,软件全程无管控。
权限系统整得挺实在,三级权限直接怼进SQLServer。用户表里RoleID字段是关键,0是操作工(只能按按钮),1是工程师(能改参数),2是管理员(随便浪)。登录时搞了个骚操作:
string decryptPass = TripleDESHelper.Decrypt(loginPass); //数据库存的加密密码
var user = db.ExecuteQuery<User>($"SELECT * FROM Users WHERE UserName='{userName}' AND Password='{decryptPass}'");
CurrentUser.Level = (UserLevel)user.RoleID;
密码用3DES加密存着,默认密码111记得改。数据库备份文件扔在/DB文件夹,用SSMS还原就能直接用。
硬件兼容这块下了血本,工厂模式玩得飞起。控制卡驱动抽象成个接口:
public interface IMotionController
{
bool InitCard(uint cardNum);
void SetAxisParam(int axis, MotionParam param);
//...20+个方法
}
//EtherCAT实现
public class EtherCATDriver : IMotionController
{
//调用dllimport的底层库
[DllImport("ECATMaster.dll")]
private static extern int ECAT_Init();
}
//研华控制卡
public class AdvantechDriver : IMotionController { ... }
配置文件里写个DriverType,启动时自动加载对应驱动。实测过Adlink 833X的200系列卡,基恩士激光器要特别注意触发时序。

C#3C运动控制软件框架,A项目标准界面,用于半导体,新能源等项目,用了5年项目框架。 包含三级权限,SQL数据操作.集成MES WebService服务调用方法。 选择轴的个数可以自定义,某个就成用到的轴也可以自定义,窗体使用模块化调用方式,集成EtherCAT adlik 833X 204 208C控制卡,研华Advtech控制卡,基恩士点 线laser调用库。 轴控制使用快捷键 Ctrl+A D W S来控制轴运动方向,流水线软件写法,等等功能,可直接打开运行,数据库文件也在目录下,还原即可登录,密码为111,软件全程无管控。
轴控制快捷键有点反人类,但用熟了是真香:
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Control && SelectedAxis != null)
{
switch (e.KeyCode)
{
case Keys.A: MoveAxis(-0.1); break; //左移
case Keys.D: MoveAxis(0.1); break; //右移
case Keys.W: JogForward(); break; //点动正转
case Keys.S: JogBackward(); break; //点动反转
}
}
}
注意这里用了死区处理,小于0.05mm/s的速度直接过滤防手抖。流水线逻辑用状态模式实现,二十几个状态自动切换,当年调这个没少掉头发。
模块化窗体是亮点,每个功能模块都是独立UserControl。主界面动态加载:
public void LoadModule(string moduleName)
{
var module = Assembly.GetExecutingAssembly()
.GetTypes()
.First(t => t.Name == moduleName + "Module");
var control = (UserControl)Activator.CreateInstance(module);
panelMain.Controls.Clear();
panelMain.Controls.Add(control);
}
数据库设计也讲究,举个轴配置表的例子:
CREATE TABLE AxisConfig (
AxisIndex INT PRIMARY KEY,
MaxSpeed DECIMAL(18,2),
Acceleration DECIMAL(18,2),
HomeOffset DECIMAL(18,3),
IsRotary BIT DEFAULT 0,
ScaleFactor DECIMAL(18,5) --脉冲当量
)
参数改完自动同步到内存对象,改完不用重启立即生效。MES对接用了个沙雕方法——直接把WebService调用封装成脚本引擎,产线小哥都能写对接代码:
var mes = new MESProxy("http://10.1.1.100/MESService");
mes.Invoke("UploadYieldData", new {
DeviceID = Config.DeviceNo,
Qty = currentYield,
Time = DateTime.Now.ToString("yyyyMMddHHmmss")
});
这框架现在看可能有点过时,但胜在开箱即用。所有dll都扔在/Lib下,VS2019打开直接F5运行。注意Windows功能里要开.NET 3.5支持,实测Win10 LTSC跑得稳稳的。

更多推荐
所有评论(0)