using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using HslCommunication; using HslCommunication.ModBus; using System.Threading; using System.Collections; using HslCommunication.Controls; using VzClientSDKDemo; using System.Runtime.InteropServices; using System.IO; namespace PLC_Communication { public partial class FormModbus : Form { private const int MSG_PLATE_INFO = 0x901; private const int MSG_DEVICE_INFO = 0x902; private int m_nPlayHandle = 0; private int m_nPlayHandle2 = 0; private string m_sAppPath; System.Timers.Timer resetrecordtime; public IntPtr hwndMain; int m_nLastLEDLevel; private Color m_originalColor; private bool m_bFirst; private bool m_bFindDev; private VzClientSDK.VZLPRC_PLATE_INFO_CALLBACK m_PlateResultCB = null; private VzClientSDK.VZLPRC_FIND_DEVICE_CALLBACK_EX find_DeviceCB = null; private VzClientSDK.VZLPRC_PLATE_INFO_CALLBACK m_PlateResultCB2 = null; public FormModbus() { Control.CheckForIllegalCrossThreadCalls = false; InitializeComponent(); } public ModBusTcpClient busTcpClient { get; set; } System.Timers.Timer timer; //定义Timer类 public delegate void SetDateTime();////定义时钟委托 public delegate void Begin_Read();//实时采集 //定义全局变量 public bool PLC_connected = false; public bool timer_Stared = false; public bool isReading = true; private void FormSiemens_Load(object sender, EventArgs e) { panel2.Enabled = false; Thread thread = new Thread(new ThreadStart(DateTimeInfo)); thread.IsBackground = true; thread.Start(); //显示当前时间 userCurve1.SetLeftCurve("A", new float[0], Color.Tomato); VzClientSDK.VzLPRClient_Setup(); hwndMain = this.Handle; m_sAppPath = System.IO.Directory.GetCurrentDirectory(); m_originalColor = pictureBox1.BackColor; m_bFirst = true; m_bFindDev = false; radledauto.Checked = true; this.listView1.Columns.Add("设备IP"); this.listView1.Columns.Add("车牌号"); this.listView1.Columns.Add("入口时间"); this.listView1.View = System.Windows.Forms.View.Details; this.listView1.FullRowSelect = true; this.listView1.GridLines = true; listView1.Columns[0].Width = 80; listView1.Columns[1].Width = 60; listView1.Columns[2].Width = 60; // outputbox.SelectedIndex = 0; } /// /// 初始化Timer控件 /// private void InitTimer() { //设置定时间隔(毫秒为单位) int interval = Convert.ToInt16(textBox10.Text); timer = new System.Timers.Timer(interval); //设置执行一次(false)还是一直执行(true) timer.AutoReset = true; //设置是否执行System.Timers.Timer.Elapsed事件 timer.Enabled = true; //绑定Elapsed事件 timer.Elapsed += new System.Timers.ElapsedEventHandler(TimerUp); } /// /// Timer类执行定时到点事件 /// /// /// private void TimerUp(object sender, System.Timers.ElapsedEventArgs e) //实时采集 { try { // currentCount += 1; this.Invoke(new Begin_Read(PLC_Read)); } catch (Exception ex) { toolStripStatusLabel1.Text = "执行定时到点事件失败:" + ex.Message; } } private void FormSiemens_FormClosing(object sender, FormClosingEventArgs e) { if (timer_Stared) { timer.Stop(); } if (PLC_connected) { busTcpClient.ConnectClose(); } } /// /// 统一的读取结果的数据解析,显示 /// /// /// /// /// private void readResultRender(OperateResult result, string address, TextBox textBox) { if (result.IsSuccess) { textBox.AppendText(DateTime.Now.ToString("[HH:mm:ss] ") + string.Format("[{address}] {result.Content}{Environment.NewLine}")); } else { toolStripStatusLabel1.Text = DateTime.Now.ToString("[HH:mm:ss] ") + string.Format("[{address}] 读取失败{Environment.NewLine}原因:{result.ToMessageShowString()}"); } } /// /// 统一的数据写入的结果显示 /// /// /// private void writeResultRender(OperateResult result, string address) { if (result.IsSuccess) { toolStripStatusLabel1.Text = DateTime.Now.ToString("[HH:mm:ss] ") + string.Format("[{address}] 写入成功"); } else { toolStripStatusLabel1.Text = DateTime.Now.ToString("[HH:mm:ss] ") + string.Format("[{address}] 写入失败{Environment.NewLine}原因:{result.ToMessageShowString()}"); } } #region Connect And Close private void button1_Click(object sender, EventArgs e)//连接服务器 { System.Net.IPAddress address; // 连接 if (!System.Net.IPAddress.TryParse(textBox1.Text, out address)) { toolStripStatusLabel1.Text = "Ip地址输入不正确!"; return; } int port; if (!int.TryParse(textBox2.Text, out port)) { toolStripStatusLabel1.Text = "端口输入不正确!"; return; } byte station; if (!byte.TryParse(textBox15.Text, out station)) { toolStripStatusLabel1.Text = "站号输入不正确!"; return; } if(busTcpClient!=null){ busTcpClient.ConnectClose(); } busTcpClient = new ModBusTcpClient(textBox1.Text, port, station); try { OperateResult connect = busTcpClient.ConnectServer(); if (connect.IsSuccess) { toolStripStatusLabel1.Text = "连接成功!"; button2.Enabled = true; button1.Enabled = false; panel2.Enabled = true; PLC_connected = true; timer_Stared = true; InitTimer(); //启动连续采集 } else { toolStripStatusLabel1.Text = "连接失败!"; } } catch (Exception ex) { toolStripStatusLabel1.Text = ex.Message; } } private void button2_Click(object sender, EventArgs e)//断开连接 { // 断开连接 busTcpClient.ConnectClose(); button2.Enabled = false; button1.Enabled = true; panel2.Enabled = false; timer.Stop(); } #endregion #region 单数据读取测试 private void button_read_bool_Click(object sender, EventArgs e) { // 读取bool变量 readResultRender(busTcpClient.ReadBoolCoil(ushort.Parse(textBox3.Text)), textBox3.Text, textBox4); } private void button_read_short_Click(object sender, EventArgs e) { // 读取short变量 readResultRender(busTcpClient.ReadShortRegister(ushort.Parse(textBox3.Text)), textBox3.Text, textBox4); } private void button_read_ushort_Click(object sender, EventArgs e) { // 读取ushort变量 readResultRender(busTcpClient.ReadUShortRegister(ushort.Parse(textBox3.Text)), textBox3.Text, textBox4); } private void button_read_int_Click(object sender, EventArgs e) { // 读取int变量 readResultRender(busTcpClient.ReadIntRegister(ushort.Parse(textBox3.Text)), textBox3.Text, textBox4); } private void button_read_uint_Click(object sender, EventArgs e) { // 读取uint变量 readResultRender(busTcpClient.ReadUIntRegister(ushort.Parse(textBox3.Text)), textBox3.Text, textBox4); } private void button_read_long_Click(object sender, EventArgs e) { // 读取long变量 readResultRender(busTcpClient.ReadLongRegister(ushort.Parse(textBox3.Text)), textBox3.Text, textBox4); } private void button_read_ulong_Click(object sender, EventArgs e) { // 读取ulong变量 readResultRender(busTcpClient.ReadULongRegister(ushort.Parse(textBox3.Text)), textBox3.Text, textBox4); } private void button_read_float_Click(object sender, EventArgs e) { // 读取float变量 readResultRender(busTcpClient.ReadFloatRegister(ushort.Parse(textBox3.Text)), textBox3.Text, textBox4); } private void button_read_double_Click(object sender, EventArgs e) { // 读取double变量 readResultRender(busTcpClient.ReadDoubleRegister(ushort.Parse(textBox3.Text)), textBox3.Text, textBox4); } private void button_read_string_Click(object sender, EventArgs e) { // 读取字符串 readResultRender(busTcpClient.ReadStringRegister(ushort.Parse(textBox3.Text), ushort.Parse(textBox5.Text)), textBox3.Text, textBox4); } #endregion #region 单数据写入测试 private void button24_Click(object sender, EventArgs e) { // bool写入 try { writeResultRender(busTcpClient.WriteOneCoil(ushort.Parse(textBox8.Text), bool.Parse(textBox7.Text)), textBox8.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button22_Click(object sender, EventArgs e) { // short写入 // string json2 = "[{\"Adress\":\"0\",\"Value\":\"0066\"}]"; string json2 = ""; try { if (!string.IsNullOrEmpty(json2)) { List Retured_v2 = JsonHelper.DeserializeJsonToList(json2);//监控值的反序列化 foreach (var item in Retured_v2) { writeResultRender(busTcpClient.WriteRegister(ushort.Parse(item.Adress), ushort.Parse(item.Value)), item.Adress); Thread.Sleep(20); } } else { if (!string.IsNullOrEmpty(textBox8.Text) && !string.IsNullOrEmpty(textBox7.Text)) writeResultRender(busTcpClient.WriteRegister(ushort.Parse(textBox8.Text), ushort.Parse(textBox7.Text)), textBox8.Text); } } catch (Exception ex) { toolStripStatusLabel1.Text = ex.Message; } } private void button21_Click(object sender, EventArgs e) { // ushort写入 try { writeResultRender(busTcpClient.WriteRegister(ushort.Parse(textBox8.Text), ushort.Parse(textBox7.Text)), textBox8.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button20_Click(object sender, EventArgs e) { // int写入 try { writeResultRender(busTcpClient.WriteRegister(ushort.Parse(textBox8.Text), int.Parse(textBox7.Text)), textBox8.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button19_Click(object sender, EventArgs e) { // uint写入 try { writeResultRender(busTcpClient.WriteRegister(ushort.Parse(textBox8.Text), uint.Parse(textBox7.Text)), textBox8.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button18_Click(object sender, EventArgs e) { // long写入 try { writeResultRender(busTcpClient.WriteRegister(ushort.Parse(textBox8.Text), long.Parse(textBox7.Text)), textBox8.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button17_Click(object sender, EventArgs e) { // ulong写入 try { writeResultRender(busTcpClient.WriteRegister(ushort.Parse(textBox8.Text), ulong.Parse(textBox7.Text)), textBox8.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button16_Click(object sender, EventArgs e) { // float写入 try { writeResultRender(busTcpClient.WriteRegister(ushort.Parse(textBox8.Text), float.Parse(textBox7.Text)), textBox8.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button15_Click(object sender, EventArgs e) { // double写入 try { writeResultRender(busTcpClient.WriteRegister(ushort.Parse(textBox8.Text), double.Parse(textBox7.Text)), textBox8.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button14_Click(object sender, EventArgs e) { // string写入 try { writeResultRender(busTcpClient.WriteRegister(ushort.Parse(textBox8.Text), textBox7.Text), textBox8.Text); } catch (Exception ex) { toolStripStatusLabel1.Text = ex.Message; } } #endregion public void PictureMarker(List aa) { int ii = 1; foreach (var item in aa) { if (ii < 10) { string name = "userLantern" + ii.ToString(); object o = GetType().GetField(name, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase).GetValue(this); string name2 = "label" + (ii + 21).ToString(); object o2 = GetType().GetField(name2, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase).GetValue(this); ((Label)o2).Text = "地址:DB" + item.Adress.ToString(); if (item.Value == "0001") ((UserLantern)o).LanternBackground = Color.LimeGreen; else if (item.Value == "0000") ((UserLantern)o).LanternBackground = Color.Red; else ((UserLantern)o).LanternBackground = Color.Silver; } ii++; } } public void DisPlayString_ToJson(string str)//采集数据显示并转Json { List Retured_v = new List(); if (!string.IsNullOrEmpty(str)) { ArrayList array = GetSeparateSubString(str, 4); int Read_adress = Convert.ToInt32(textBox6.Text); Retured_v.Clear(); foreach (string arr in array) { PLC_Retured_value Retured_value = new PLC_Retured_value(); Value_List.Text += "DB地址" + Read_adress + ": " + arr + " \r\n"; Retured_value.Adress = Read_adress.ToString(); Retured_value.Value = arr; //实体集合序列化和反序列化 Retured_v.Add(Retured_value); Read_adress++; } } string json2 = JsonHelper.SerializeObject(Retured_v); //序列化 List Retured_v2 = JsonHelper.DeserializeJsonToList(json2);//监控值的反序列化 PictureMarker(Retured_v2); //监控图标变色 } private ArrayList GetSeparateSubString(string txtString, int charNumber) //charNumber为要截取的每段的长度 { ArrayList arrlist = new ArrayList(); string tempStr = txtString; for (int i = 0; i < tempStr.Length; i += charNumber)//首先判断字符串的长度,循环截取,进去循环后首先判断字符串是否大于每段的长度 { if ((tempStr.Length - i) > charNumber)//如果是,就截取 { arrlist.Add(tempStr.Substring(i, charNumber)); } else { arrlist.Add(tempStr.Substring(i));//如果不是,就截取最后剩下的那部分 } } return arrlist; } #region 批量读取测试 private void button25_Click(object sender, EventArgs e)//读取 { if (!isReading) { timer.Start(); button25.Text = "停止"; isReading = true; } else { button25.Text = "开始"; isReading = false; timer.Stop(); } } #endregion #region 报文读取测试 private void button26_Click(object sender, EventArgs e) { try { OperateResult read = busTcpClient.ReadFromServerCore(HslCommunication.BasicFramework.SoftBasic.HexStringToBytes(textBox13.Text)); if (read.IsSuccess) { textBox11.Text = "结果:" + HslCommunication.BasicFramework.SoftBasic.ByteToHexString(read.Content); } else { MessageBox.Show("读取失败:" + read.ToMessageShowString()); } } catch (Exception ex) { MessageBox.Show("读取失败:" + ex.Message); } } #endregion #region 定时器读取测试 // 外加曲线显示 private Thread thread = null; // 后台读取的线程 private int timeSleep = 300; // 读取的间隔 private bool isThreadRun = false; // 用来标记线程的运行状态 private void button27_Click(object sender, EventArgs e) { // 启动后台线程,定时读取PLC中的数据,然后在曲线控件中显示 if (!isThreadRun) { if (!int.TryParse(textBox14.Text, out timeSleep)) { toolStripStatusLabel1.Text = "间隔时间格式输入错误!"; return; } button27.Text = "停止"; isThreadRun = true; thread = new Thread(ThreadReadServer); thread.IsBackground = true; thread.Start(); } else { button27.Text = "启动"; isThreadRun = false; } } private void ThreadReadServer() { while (isThreadRun) { Thread.Sleep(timeSleep); try { OperateResult read = busTcpClient.ReadShortRegister(ushort.Parse(textBox12.Text)); if (read.IsSuccess) { // 显示曲线 if (isThreadRun) Invoke(new Action(AddDataCurve), read.Content); } } catch (Exception ex) { toolStripStatusLabel1.Text = "读取失败:" + ex.Message; } } } private void AddDataCurve(short data) { userCurve1.AddCurveData("A", data); } #endregion private void PLC_Read() { try { OperateResult read = busTcpClient.ReadRegister(ushort.Parse(textBox6.Text), ushort.Parse(textBox9.Text)); if (read.IsSuccess) { Value_List.Text = ""; string returned_value = HslCommunication.BasicFramework.SoftBasic.ByteToHexString(read.Content); DisPlayString_ToJson(returned_value); } else { toolStripStatusLabel1.Text = "读取失败:" + read.ToMessageShowString(); } } catch (Exception ex) { toolStripStatusLabel1.Text = "读取失败:" + ex.Message; } } private void DateTimeInfo() { while (true) { SetDateTime setDate = new SetDateTime( delegate { toolStripStatusLabel2.Text = DateTime.Now.ToString(); }); setDate(); Thread.Sleep(1000); } // ReSharper disable once FunctionNeverReturns } private void startsearchdev_Click(object sender, EventArgs e) { VzClientSDK.VZLPRClient_StopFindDevice(); dev_treeview.Nodes.Clear(); find_DeviceCB = new VzClientSDK.VZLPRC_FIND_DEVICE_CALLBACK_EX(FIND_DEVICE_CALLBACK_EX); int ret = VzClientSDK.VZLPRClient_StartFindDeviceEx(find_DeviceCB, IntPtr.Zero); if (ret == 0) { m_bFindDev = true; } } private void FIND_DEVICE_CALLBACK_EX(string pStrDevName, string pStrIPAddr, ushort usPort1, ushort usPort2, uint SL, uint SH, string netmask, string gateway, IntPtr pUserData) { string pStrDev = pStrIPAddr.ToString() + ":" + usPort1.ToString(); string serialNO = SL.ToString() + ":" + SH.ToString() + ":" + netmask + ":" + gateway; VzClientSDK.VZ_LPR_DEVICE_INFO device_info = new VzClientSDK.VZ_LPR_DEVICE_INFO(); device_info.device_ip = pStrDev; device_info.serial_no = serialNO; int size = Marshal.SizeOf(device_info); IntPtr intptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(device_info, intptr, true); Win32API.PostMessage(hwndMain, MSG_DEVICE_INFO, (int)intptr, 0); } private void stopsearchdev_Click(object sender, EventArgs e) { VzClientSDK.VZLPRClient_StopFindDevice(); if (m_bFindDev) { m_bFindDev = false; } } private void btnNetCfg_Click(object sender, EventArgs e) { if (dev_treeview.SelectedNode != null) { string ip = dev_treeview.SelectedNode.Text.ToString(); string serialNO = dev_treeview.SelectedNode.Tag.ToString(); string[] arrIP = ip.Split(new char[] { ':' }); string[] arrSerial = serialNO.Split(new char[] { ':' }); uint SL = uint.Parse(arrSerial[0]); uint SH = uint.Parse(arrSerial[1]); NetCfg_Form from = new NetCfg_Form(); from.StartPosition = FormStartPosition.CenterScreen; from.SetNetParam(arrIP[0], SL, SH, arrSerial[2], arrSerial[3]); from.Show(); } else { toolStripStatusLabel1.Text = "请选择搜索设备列表中的设备"; } } private void btnOpen_Click(object sender, EventArgs e) { short nPort = Int16.Parse(txtPort.Text); int handle = VzClientSDK.VzLPRClient_Open(txtIP.Text, (ushort)nPort, txtUserName.Text, txtPwd.Text); if (handle == 0) { toolStripStatusLabel1.Text = txtIP.Text + "摄像头打开失败"; return; } toolStripStatusLabel1.Text = txtIP.Text + "摄像头打开成功"; TreeNode node = new TreeNode(txtIP.Text); node.Tag = handle; treeDevice.Nodes.Add(node); treeDevice.SelectedNode = node; } private void btnClose_Click(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = lprHandle.ToString() + "请选择一台列表中的设备"; return; } if (lprHandle == GetPicBox1Handle()) { if (m_nPlayHandle > 0) { int ret = VzClientSDK.VzLPRClient_StopRealPlay(m_nPlayHandle); m_nPlayHandle = 0; } Pic1Close(); Pic2Close(); } else { if (m_nPlayHandle2 > 0) { int ret = VzClientSDK.VzLPRClient_StopRealPlay(m_nPlayHandle2); m_nPlayHandle2 = 0; } Pic3Close(); Pic4Close(); } VzClientSDK.VzLPRClient_Close(lprHandle); treeDevice.Nodes.Remove(treeDevice.SelectedNode); } private int GetSeleHandle() { int handle = 0; if (treeDevice.SelectedNode != null) { string sHandle = treeDevice.SelectedNode.Tag.ToString(); handle = Int32.Parse(sHandle); } return handle; } private int GetPicBox1Handle() { int handle = 0; if (pictureBox1.Tag != null) { string sHandle = pictureBox1.Tag.ToString(); handle = Int32.Parse(sHandle); } return handle; } private delegate void Pic1CloseThread(); public void Pic1Close() { Pic1CloseThread Pic1CloseDelegate = delegate () { pictureBox1.Image = null; pictureBox1.Refresh(); pictureBox1.Tag = 0; }; pictureBox1.Invoke(Pic1CloseDelegate); } //关闭第二个窗口 private delegate void Pic2CloseThread(); public void Pic2Close() { Pic2CloseThread Pic2CloseDelegate = delegate () { pictureBox2.Image = null; pictureBox2.Refresh(); }; pictureBox2.Invoke(Pic2CloseDelegate); } //关闭第三个窗口 private delegate void Pic3CloseThread(); public void Pic3Close() { Pic2CloseThread Pic3CloseDelegate = delegate () { pictureBox3.Image = null; pictureBox3.Refresh(); pictureBox3.Tag = 0; }; pictureBox3.Invoke(Pic3CloseDelegate); } //关闭第四个窗口 private delegate void Pic4CloseThread(); public void Pic4Close() { Pic1CloseThread Pic4CloseDelegate = delegate () { pictureBox4.Image = null; pictureBox4.Refresh(); }; pictureBox4.Invoke(Pic4CloseDelegate); } private void btnManual_Click(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } if (lprHandle > 0) { VzClientSDK.VzLPRClient_ForceTrigger(lprHandle); } } private void startoutputbtn_Click(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } if (lprHandle == GetPicBox1Handle() || lprHandle == GetPicBox3Handle()) { toolStripStatusLabel1.Text = "该设备已经输出在视频窗口中,请先停止。"; return; } if (m_bFirst) { pictureBox1.Image = null; if (m_nPlayHandle > 0) { VzClientSDK.VzLPRClient_StopRealPlay(m_nPlayHandle); m_nPlayHandle = 0; } int lprHandle1 = GetPicBox1Handle(); if (lprHandle1 > 0) { VzClientSDK.VzLPRClient_SetPlateInfoCallBack(lprHandle1, null, IntPtr.Zero, 0); } m_nPlayHandle = VzClientSDK.VzLPRClient_StartRealPlay(lprHandle, pictureBox1.Handle); pictureBox1.Tag = lprHandle; // 设置车牌识别结果回调 m_PlateResultCB = new VzClientSDK.VZLPRC_PLATE_INFO_CALLBACK(OnPlateResult); VzClientSDK.VzLPRClient_SetPlateInfoCallBack(lprHandle, m_PlateResultCB, IntPtr.Zero, 1); } else { pictureBox3.Image = null; if (m_nPlayHandle2 > 0) { VzClientSDK.VzLPRClient_StopRealPlay(m_nPlayHandle2); m_nPlayHandle2 = 0; } int lprHandle2 = GetPicBox3Handle(); if (lprHandle2 > 0) { VzClientSDK.VzLPRClient_SetPlateInfoCallBack(lprHandle2, null, IntPtr.Zero, 0); } m_nPlayHandle2 = VzClientSDK.VzLPRClient_StartRealPlay(lprHandle, pictureBox3.Handle); pictureBox3.Tag = lprHandle; // 设置车牌识别结果回调 m_PlateResultCB2 = new VzClientSDK.VZLPRC_PLATE_INFO_CALLBACK(OnPlateResult); VzClientSDK.VzLPRClient_SetPlateInfoCallBack(lprHandle, m_PlateResultCB2, IntPtr.Zero, 1); } } private int OnPlateResult(int handle, IntPtr pUserData, IntPtr pResult, uint uNumPlates, VzClientSDK.VZ_LPRC_RESULT_TYPE eResultType, IntPtr pImgFull, IntPtr pImgPlateClip) { if (eResultType != VzClientSDK.VZ_LPRC_RESULT_TYPE.VZ_LPRC_RESULT_REALTIME) { VzClientSDK.TH_PlateResult result = (VzClientSDK.TH_PlateResult)Marshal.PtrToStructure(pResult, typeof(VzClientSDK.TH_PlateResult)); string strLicense = new string(result.license); VzClientSDK.VZ_LPR_MSG_PLATE_INFO plateInfo = new VzClientSDK.VZ_LPR_MSG_PLATE_INFO(); plateInfo.plate = strLicense; DateTime now = DateTime.Now; string sTime = string.Format("{0:yyyyMMddHHmmssffff}", now); string strFilePath = m_sAppPath + "\\" + Get_IP(handle) + "\\cap\\"; if (!Directory.Exists(strFilePath)) { Directory.CreateDirectory(strFilePath); } string path = strFilePath + sTime + ".jpg"; //取消号牌机自动保存图片功能 //VzClientSDK.VzLPRClient_ImageSaveToJpeg(pImgFull, path, 100); plateInfo.img_path = path; int size = Marshal.SizeOf(plateInfo); IntPtr intptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(plateInfo, intptr, true); Win32API.PostMessage(hwndMain, MSG_PLATE_INFO, (int)intptr, handle); } return 0; } protected override void DefWndProc(ref Message m) { IntPtr intptr; VzClientSDK.VZ_LPR_MSG_PLATE_INFO plateInfo; VzClientSDK.VZ_LPR_DEVICE_INFO deviceInfo; int handle = 0; switch (m.Msg) { case MSG_PLATE_INFO: intptr = (IntPtr)m.WParam.ToInt32(); handle = m.LParam.ToInt32(); if (intptr != null) { // VzClientSDK.VzLPRClient_SetIOOutputAuto(m_hLPRClient, 0, 500); //根据句柄获取设备IP byte[] strDecIP = new byte[32]; int max_count = 32; int ret = VzClientSDK.VzLPRClient_GetDeviceIP(handle, ref strDecIP[0], max_count); string strIP = System.Text.Encoding.Default.GetString(strDecIP); strIP = strIP.TrimEnd('\0'); plateInfo = (VzClientSDK.VZ_LPR_MSG_PLATE_INFO)Marshal.PtrToStructure(intptr, typeof(VzClientSDK.VZ_LPR_MSG_PLATE_INFO)); if (handle == GetPicBox1Handle()) { // 显示车牌号 if (plateInfo.plate != "") { // lblPlate.Text = strIP+"- " + plateInfo.plate; } // 显示图片 if (plateInfo.img_path != "") { //pictureBox2.Image = Image.FromFile(plateInfo.img_path); } } else { // 显示车牌号 if (plateInfo.plate != "") { // lblPlate2.Text = strIP + "- "+ plateInfo.plate; } // 显示图片 if (plateInfo.img_path != "") { //pictureBox4.Image = Image.FromFile(plateInfo.img_path); } } ShowDetail(plateInfo,strIP); Marshal.FreeHGlobal(intptr); } break; case MSG_DEVICE_INFO: intptr = (IntPtr)m.WParam.ToInt32(); if (intptr != null) { deviceInfo = (VzClientSDK.VZ_LPR_DEVICE_INFO)Marshal.PtrToStructure(intptr, typeof(VzClientSDK.VZ_LPR_DEVICE_INFO)); ShowDevice(deviceInfo.device_ip, deviceInfo.serial_no); Marshal.FreeHGlobal(intptr); } break; default: base.DefWndProc(ref m); break; } } //触发结果显示 private void ShowDetail(VzClientSDK.VZ_LPR_MSG_PLATE_INFO plateInformation,string strIP) { Lic_Retured_value Retured_LIC = new Lic_Retured_value(); Retured_LIC.Licence_Num = strIP + "-" + plateInformation.plate; Retured_LIC.Image_path = plateInformation.img_path; Retured_LIC.Time_income = DateTime.Now.ToLocalTime().ToString(); ; string json1 = JsonHelper.SerializeObject(Retured_LIC); //序列化 Lic_Retured_value Retured_Licence = JsonHelper.DeserializeJsonToObject(json1); ListViewItem item = new ListViewItem(strIP); item.SubItems.Add(Retured_Licence.Licence_Num.Substring(Retured_Licence.Licence_Num.Length - 7)); item.SubItems.Add(Retured_Licence.Time_income); this.listView1.Items.Add(item); int countPlateMsg = this.listView1.Items.Count; int flagItem = 50;//超过50条,删除一条 if (countPlateMsg > flagItem) { this.listView1.Items[countPlateMsg - 1].Remove(); } if (listBox1.Items.Count < 20) //信息显示 listBox1.Items.Add("车牌号:" + Retured_Licence.Licence_Num.Substring(Retured_Licence.Licence_Num.Length - 7) + " 进场时间:" + Retured_Licence.Time_income); else listBox1.Items.Clear(); } public void ShowDevice(string pStrDev, string serialNO) { TreeNode node = new TreeNode(pStrDev); node.Tag = serialNO; dev_treeview.Nodes.Add(node); dev_treeview.Sort(); } private int GetPicBox3Handle() { int handle = 0; if (pictureBox3.Tag != null) { string sHandle = pictureBox3.Tag.ToString(); handle = Int32.Parse(sHandle); } return handle; } private void stoprealplaybtn_Click(object sender, EventArgs e) { if (m_bFirst) { if (m_nPlayHandle > 0) { int ret = VzClientSDK.VzLPRClient_StopRealPlay(m_nPlayHandle); m_nPlayHandle = 0; } int lprHandle = GetPicBox1Handle(); if (lprHandle > 0) { VzClientSDK.VzLPRClient_SetPlateInfoCallBack(lprHandle, null, IntPtr.Zero, 0); } lblPlate.Text = ""; Pic1Close(); Pic2Close(); } else { if (m_nPlayHandle2 > 0) { int ret = VzClientSDK.VzLPRClient_StopRealPlay(m_nPlayHandle2); m_nPlayHandle2 = 0; } int lprHandle2 = GetPicBox3Handle(); if (lprHandle2 > 0) { VzClientSDK.VzLPRClient_SetPlateInfoCallBack(lprHandle2, null, IntPtr.Zero, 0); } lblPlate2.Text = ""; Pic3Close(); Pic4Close(); } } private void btnConnStat_Click(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } byte stat = 0; VzClientSDK.VzLPRClient_IsConnected(lprHandle, ref stat); byte[] strDecIP = new byte[32]; int max_count = 32; int ret = VzClientSDK.VzLPRClient_GetDeviceIP(lprHandle, ref strDecIP[0], max_count); string strIP = System.Text.Encoding.Default.GetString(strDecIP); strIP = strIP.TrimEnd('\0'); if (stat == 1) { toolStripStatusLabel1.Text = strIP + "号牌机连接正常"; } else { toolStripStatusLabel1.Text = strIP + "号牌机连接断开"; } } private void recordbtn_Click(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } resetrecordtime = new System.Timers.Timer(1000 * 20); resetrecordtime.Elapsed += new System.Timers.ElapsedEventHandler(RecordReset); resetrecordtime.AutoReset = true; resetrecordtime.Enabled = true; string strFilePath = m_sAppPath + "\\" + Get_IP(lprHandle) + "\\Video"; if (!Directory.Exists(strFilePath)) { Directory.CreateDirectory(strFilePath); } string szPath = strFilePath + "\\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".avi"; VzClientSDK.VzLPRClient_SaveRealData(lprHandle, szPath); recordbtn.Enabled = false; stoprecordbtn.Enabled = true; } public void RecordReset(object source, System.Timers.ElapsedEventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } VzClientSDK.VzLPRClient_StopSaveRealData(lprHandle); string strFilePath = m_sAppPath + "\\" + Get_IP(lprHandle) + "Video"; string szPath = strFilePath + "\\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + ".avi"; VzClientSDK.VzLPRClient_SaveRealData(lprHandle, szPath); } private void stoprecordbtn_Click(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } VzClientSDK.VzLPRClient_StopSaveRealData(lprHandle); resetrecordtime.Close(); stoprecordbtn.Enabled = false; recordbtn.Enabled = true; } private void btnVideoCfg_Click(object sender, EventArgs e) { //Thread th = new Thread(ReadDoc); //th.IsBackground = true; //th.Start(); int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } int board_type = 0; VzClientSDK.VzLPRClient_GetHwBoardType(lprHandle, ref board_type); if (board_type == 3) { RVideoCfg_Form from = new RVideoCfg_Form(); from.StartPosition = FormStartPosition.CenterScreen; from.SetLPRHandle(lprHandle); from.Show(); } else { VideoCfg_Form from = new VideoCfg_Form(); from.StartPosition = FormStartPosition.CenterScreen; from.SetLPRHandle(lprHandle); from.Show(); } } private void ReadDoc() { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } int board_type = 0; VzClientSDK.VzLPRClient_GetHwBoardType(lprHandle, ref board_type); if (board_type == 3) { RVideoCfg_Form from = new RVideoCfg_Form(); from.StartPosition = FormStartPosition.CenterScreen; from.SetLPRHandle(lprHandle); from.Show(); } else { VideoCfg_Form from = new VideoCfg_Form(); from.StartPosition = FormStartPosition.CenterScreen; from.SetLPRHandle(lprHandle); from.Show(); } } private void btnRuleCfg_Click(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } RuleCfg_Form from = new RuleCfg_Form(); from.StartPosition = FormStartPosition.CenterScreen; from.SetLPRHandle(lprHandle); from.Show(); } private void m_btnBaseConfig_Click(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } BaseConfig_From configform = new BaseConfig_From(); configform.StartPosition = FormStartPosition.CenterScreen; configform.SetLPRHandle(lprHandle); configform.ShowDialog(); } private void radledauto_CheckedChanged(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } VzClientSDK.VzLPRClient_SetLEDLightControlMode(lprHandle, VzClientSDK.VZ_LED_CTRL.VZ_LED_AUTO); } private void radledon_CheckedChanged(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } VzClientSDK.VzLPRClient_SetLEDLightControlMode(lprHandle, VzClientSDK.VZ_LED_CTRL.VZ_LED_MANUAL_ON); } private void radledoff_CheckedChanged(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } VzClientSDK.VzLPRClient_SetLEDLightControlMode(lprHandle, VzClientSDK.VZ_LED_CTRL.VZ_LED_MANUAL_OFF); } private void ledbar_Scroll(object sender, EventArgs e) { int lprHandle = GetSeleHandle(); if (lprHandle == 0) { toolStripStatusLabel1.Text = "请选择一台列表中的设备"; return; } int nValue = ledbar.Value - 1; int nLevelNow = 0; int nLevelMax = 0; VzClientSDK.VzLPRClient_GetLEDLightStatus(lprHandle, ref nLevelNow, ref nLevelMax); m_nLastLEDLevel = nLevelNow; if (nValue != nLevelNow) { VzClientSDK.VzLPRClient_SetLEDLightLevel(lprHandle, nValue); m_nLastLEDLevel = nValue; } } private void pictureBox2_Click(object sender, EventArgs e) { } private void pictureBox1_Click(object sender, EventArgs e) { Color c = Color.FromArgb(255, 220, 220, 220); pictureBox1.BackColor = c; pictureBox3.BackColor = m_originalColor; m_bFirst = true; } private string Get_IP(int lprHandle) { byte[] strDecIP = new byte[32]; int max_count = 32; int ret = VzClientSDK.VzLPRClient_GetDeviceIP(lprHandle, ref strDecIP[0], max_count); string strIP = System.Text.Encoding.Default.GetString(strDecIP); strIP = strIP.TrimEnd('\0'); return strIP; } private void pictureBox3_Click(object sender, EventArgs e) { pictureBox1.BackColor = m_originalColor; Color c = Color.FromArgb(255, 220, 220, 220); pictureBox3.BackColor = c; m_bFirst = false; } } public class Win32API { [DllImport("User32.dll", EntryPoint = "FindWindow")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("User32.dll", EntryPoint = "FindWindowEx")] public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName); /// /// 自定义的结构 /// public struct My_lParam { public int i; public string s; } /// /// 使用COPYDATASTRUCT来传递字符串 /// [StructLayout(LayoutKind.Sequential)] public struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; } //消息发送API [DllImport("User32.dll", EntryPoint = "SendMessage")] public static extern int SendMessage( IntPtr hWnd, // 信息发往的窗口的句柄 int Msg, // 消息ID int wParam, // 参数1 int lParam //参数2 ); //消息发送API [DllImport("User32.dll", EntryPoint = "SendMessage")] public static extern int SendMessage( IntPtr hWnd, // 信息发往的窗口的句柄 int Msg, // 消息ID int wParam, // 参数1 ref My_lParam lParam //参数2 ); //消息发送API [DllImport("User32.dll", EntryPoint = "SendMessage")] public static extern int SendMessage( IntPtr hWnd, // 信息发往的窗口的句柄 int Msg, // 消息ID int wParam, // 参数1 ref COPYDATASTRUCT lParam //参数2 ); //消息发送API [DllImport("User32.dll", EntryPoint = "PostMessage")] public static extern int PostMessage( IntPtr hWnd, // 信息发往的窗口的句柄 int Msg, // 消息ID int wParam, // 参数1 int lParam // 参数2 ); //消息发送API [DllImport("User32.dll", EntryPoint = "PostMessage")] public static extern int PostMessage( IntPtr hWnd, // 信息发往的窗口的句柄 int Msg, // 消息ID int wParam, // 参数1 ref My_lParam lParam //参数2 ); //异步消息发送API [DllImport("User32.dll", EntryPoint = "PostMessage")] public static extern int PostMessage( IntPtr hWnd, // 信息发往的窗口的句柄 int Msg, // 消息ID int wParam, // 参数1 ref COPYDATASTRUCT lParam // 参数2 ); } }