EQ控制卡二次开发(火凤凰、蓝精灵异步单双色控制卡卡)
在工业信息化行业,少不了生产可视化的模块,其中应用最多的是采用LED屏的方式,通过软件控制屏幕展示相关的生产计划完成状态,工位的状态,产线的运行状态,以及相关自动化设备的状态等,这就要求通信实时性,准确性。LED屏控制核心在于控制卡目前市场上各种控制卡种类繁多,今天先介绍下EQ系列的控制卡吧。其实通信实时性要求采用同步卡效果最佳,但是苦于现场不想增加专用的控制电脑(大部分同步卡原理即抓屏模式,实时展现电脑桌面的内容,电脑不能同时进行其他操作),所以决定采用异步卡异步通信,直接在后台通过程序建立和LED屏幕的连接,实时发送数据给LED屏幕。此篇就讲下根据官方二次开发包开发的问题。
此处我们采用的是网络通讯的方式,即EQ控制卡上需固定IP,用以识别并和控制程序建立连接。
EQ2008_Dll.dll是官方提供的开发接口,其中的接口方法包含如下:
using System; using System.Runtime.InteropServices; using ServiceCloud.Devices.Led.EQ2008.Parameters; namespace ServiceCloud.Devices.Led.EQ2008 { /* 本动态库接口适用于:EQ火凤凰系列和蓝精灵系列控制器! 火凤凰系列:EQ2013、EQ2023、EQ2033 蓝精灵系列:EQ2012、EQ2011、EQ2008-1/2E、EQ2008-M */ internal class LedControllerHandler { # region 1.节目操作函数 /// <summary> /// 添加节目 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <param name="bWaitToEnd">TRUE 等待节目播放完成再播放下个节目,FALSE 节目播放时间为 iPlayTime</param> /// <param name="iPlayTime">节目播放时间,单位为秒</param> /// <returns>节目索引号</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern int User_AddProgram(int CardNum, Boolean bWaitToEnd, int iPlayTime); /// <summary> /// 删除一个节目 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <param name="iProgramIndex">节目索引号</param> /// <returns>0-删除失败,1-删除成功</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern bool User_DelProgram(int CardNum, int iProgramIndex); /// <summary> /// 删除所有节目 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <returns>0-删除失败,1-删除成功</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern bool User_DelAllProgram(int CardNum); /// <summary> /// 添加文本区 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <param name="pText">文本参数表指针,参考【参数表】中 9</param> /// <param name="iProgramIndex">节目索引号</param> /// <returns>-1-添加文本区失败,非-1-分区编号</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern int User_AddText(int CardNum, ref User_Text pText, int iProgramIndex); /// <summary> /// 添加单行文本区 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <param name="pSingleText">单行文本参数表指针,参考【参数表】中 8</param> /// <param name="iProgramIndex">节目索引号</param> /// <returns>-1-添加单行文本区失败,非-1-分区编号</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern int User_AddSingleText(int CardNum, ref User_SingleText pSingleText, int iProgramIndex); /// <summary> /// 添加图文区 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <param name="pBmp">图文区参数表指针,参考【参数表】中 7</param> /// <param name="iProgramIndex">节目索引号</param> /// <returns>-1-添加图文区失败,非-1-分区编号</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern int User_AddBmpZone(int CardNum, User_Bmp pBmp, int iProgramIndex); /// <summary> /// 指定图像句柄添加图片 /// </summary> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern bool User_AddBmp(int CardNum, int iBmpPartNum, IntPtr hBitmap, ref User_MoveSet pMoveSet, int iProgramIndex); /// <summary> /// 指定图像路径添加图片 /// </summary> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern bool User_AddBmpFile(int CardNum, int iBmpPartNum, string strFileName, ref User_MoveSet pMoveSet, int iProgramIndex); /// <summary> /// 添加时间区 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <param name="pdateTime">时间参数表指针,参考【参数表】中 6</param> /// <param name="iProgramIndex">节目索引号</param> /// <returns>-1-添加时间区失败,非-1-分区编号</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern int User_AddTime(int CardNum, ref User_DateTime pdateTime, int iProgramIndex); /// <summary> /// 添加倒计时区 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <param name="pTimeCount">倒计时参数表指针,参考【参数表】中 4</param> /// <param name="iProgramIndex">节目索引号</param> /// <returns>-1-添加计时区失败,非-1-分区编号</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern int User_AddTimeCount(int CardNum, User_Timer pTimeCount, int iProgramIndex); /// <summary> /// 添加温度区 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <param name="pTemperature">温度参数表指针,参考【参数表】中 5</param> /// <param name="iProgramIndex">节目索引号</param> /// <returns>-1-添加温度区失败,非-1-分区编号</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern int User_AddTemperature(int CardNum, User_Temperature pTemperature, int iProgramIndex); /// <summary> /// 添加 RTF 文件区 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <param name="pRTFt">RTF 文件参数表指针,参考【参数表】中 10</param> /// <param name="iProgramIndex">节目索引号</param> /// <returns>-1-添加文本区失败,非-1-分区编号</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern int User_AddRTF(int CardNum, User_RTF pRTFt, int iProgramIndex); /// <summary> /// 向控制器发送数据 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <returns>FALSE - 发送失败,TRUE - 发送成功</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern bool User_SendToScreen(int CardNum); #endregion #region 2.实时发送数据(高频率发送) //实时建立连接 [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern bool User_RealtimeConnect(int CardNum); //实时关闭连接 [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern bool User_RealtimeDisConnect(int CardNum); //实时发送图片数据 [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern bool User_RealtimeSendData(int CardNum, int x, int y, int iWidth, int iHeight, IntPtr hBitmap); //实时发送图片文件 [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern Boolean User_RealtimeSendBmpData(int CardNum, int x, int y, int iWidth, int iHeight, string strFileName); //实时发送文本 [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern Boolean User_RealtimeSendText(int CardNum, int x, int y, int iWidth, int iHeight, string strText, ref User_FontSet pFontInfo); //实时发送清屏 [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern Boolean User_RealtimeScreenClear(int CardNum); #endregion #region 3.显示屏控制函数组 /// <summary> /// 校正时间 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <returns>FALSE - 板卡校正时间失败,TRUE - 板卡校正时间成功</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern Boolean User_AdjustTime(int CardNum); /// <summary> /// 打开显示屏 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <returns>FALSE - 打开显示屏失败,TRUE - 打开显示屏成功</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern bool User_OpenScreen(int CardNum); /// <summary> /// 关闭显示屏 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <returns>FALSE - 关闭显示屏失败,TRUE - 关闭显示屏成功</returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern bool User_CloseScreen(int CardNum); /// <summary> /// 亮度调节 /// </summary> /// <param name="CardNum">控制卡地址,基数为 1,即第一块控制卡地址为 1</param> /// <param name="iLightDegreen">屏幕亮度值</param> /// <returns></returns> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern Boolean User_SetScreenLight(int CardNum, int iLightDegreen); /// <summary> /// Reload参数文件 /// </summary> /// <param name="strEQ2008_Dll_Set_Path"></param> [DllImport("EQ2008_Dll.dll", CharSet = CharSet.Ansi)] public static extern void User_ReloadIniFile(string strEQ2008_Dll_Set_Path); #endregion [DllImport("gdi32.dll")] public static extern bool DeleteObject(IntPtr hObject); } }
EQ2008_Dll_Set.ini是LED屏幕的通信的配置文件,在屏幕初始化之前就要存在,可手动配置好放至程序运行的根目录,为了可复用性,在此将其在程序配置【通信地址(ip),端口号(port),屏幕大小(screenHeight,screenWidth),单双色(colorStyle),控制卡型号(cardType)】,在程序运行前(即Program.cs文件中动态生成EQ2008_Dll_Set.ini文件)
var screens = BLL.Common.DataSetCache.Screens; foreach (var screen in screens) { if (screen.screenType == Setting.屏幕类型.主控屏) ServiceCloud.Devices.Led.EQ2008.LedController.Register(CardType.EQ2023, ScreenColorStyle.Multicolor, 224, 1024, screen.ip, 5005); if (screen.screenType == Setting.屏幕类型.分装区屏) ServiceCloud.Devices.Led.EQ2008.LedController.Register(CardType.EQ2023, ScreenColorStyle.Multicolor, 192, 192, screen.ip, 5005); if (screen.screenType == Setting.屏幕类型.配发区屏) ServiceCloud.Devices.Led.EQ2008.LedController.Register(CardType.EQ2023, ScreenColorStyle.Multicolor, 64, 384, screen.ip, 5005); } ServiceCloud.Devices.Led.EQ2008.LedController.Initialize();