请教一下
工程流程描述如下:
将第1个电池放在扫码枪正下方固定盒内,按下启动按钮DI1,Port1发送LON命令给基恩士扫码枪SR-751,扫码枪正常获取二维码内容,二维码内容自动存储到电脑D盘excel里,存储位置在第2行第1列,延时1秒后,DI5在true的状态下,进退气缸前进,前进到位后,DI4变为 true,延时1秒,升降气缸下降,下降到位后,DI6变为 true,延时1秒后,Port2发送 Result? 命令给 Chroma19073耐压仪,Chroma19073耐压仪正常获取电压电阻数值,电压电阻数值自动存储到电脑D盘excel里,电压存储位置在第2行第2列,电阻存储位置在第2行第3列。存储好电压电阻,延迟1秒,升降气缸上升,上升到位后,DI5变为true,延时1秒后,进退气缸后退,后退到位后,DI3变为true,C#程序回到初始监听状态。第2个电池扫码后扫码内容存储在电脑
D盘excel第3行第1列,电压数值存储在D盘 excel第3行第2列,电阻数值存储在D盘excel
第3行第3列,同理依次类推。若本次扫码获取超时10秒,在ListView控件框内显示扫码超时,请按初始监听按钮DI2,让C#程序回到初始监听状态。若本次扫码获取正常,获取电压电阻获取数值超时10秒,在ListView控件框内显示电压电阻读取超时请按初始监听按钮DI2,延时1秒后,清除本次扫码内容,先让升降气缸上升,上升到位后,DI5变为true,延时1秒后,进退气缸后退,后退到位后,DI3变为true,C#程序回到初始监听状态。若进退气缸原始位 DI3和升降气缸原始位DI5为false状态,进退气缸和升降气缸在动作位若为false,在ListView控件框内显示对应原始位和动作位报警,程序需暂停,等调好气缸上原始位置和动作位置开关导通为止,按暂停/继续按钮,C#程序又从刚才瞬间暂停位置运行起来。
网线连接状态如下:
1.台式电脑主机上RJ45网口连至交换机网口
2.卓岚串行服务器ZLAN5443A的RJ45网口连至交换机网口,Port1触发基恩士扫码枪 SR-751 Port2触发Chroma 19073耐压仪。
3.卓岚IO控制器ZLAN6844的RJ45网口连至交换机网口。
卓岚IO控制器ZLAN6844输入输出列表如下:
输入点:
DI1 启动按钮
DI2 初始监听按钮
DI3 进退气缸原始位
DI4 进退气缸动作位
DI5 升降气缸原始位
DI6 升降气缸动作位
DI7 暂停/继续按钮
输出点:
DO1进退气缸
DO2 升降气缸
Port1触发基恩士SR-751扫码和Port2触发Chroma19073读电压电阻
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注根据你提供的流程描述,这是一个基于设备通讯和物理控制的自动化测试系统,涉及多个设备的操作,包括扫码枪、耐压仪、气缸控制等,同时还需要与Excel文件交互来存储扫描到的数据。
在 C# 中实现这个系统,我们需要使用以下步骤来完成整个流程:
关键技术点
通讯与控制:
- 使用网口进行通讯,特别是通过 Port1 与基恩士 SR-751 扫码枪通讯,Port2 与 Chroma 19073 耐压仪通讯。
- 控制 IO 控制器(ZLAN6844)上的输入和输出点,通过 DI 和 DO 点控制设备(气缸的动作、按钮状态等)。
设备通信协议:
- 使用基恩士扫码枪 SR-751,发送特定命令(如 LON 命令)进行扫码。
- 使用 Chroma 19073 耐压仪,发送命令(如
Result?命令)获取电压和电阻值。
Excel 数据存储:
- 将二维码内容、电压、电阻值存储到 Excel 文件中的指定单元格。
IO 控制与错误处理:
- 根据各个 DI 点的状态来控制气缸动作,处理暂停/继续按钮。
- 处理超时(扫码超时、电压电阻读取超时)并更新界面。
解决方案设计
1. 系统整体框架设计:
- 用 多线程/异步 模型来处理扫码、获取电压电阻等任务,以避免阻塞主线程。
- 使用 串行通讯(通过 TCP/IP、串口或其他方式)与基恩士扫码枪和 Chroma 耐压仪进行通讯。
- IO 控制 使用 ZLAN6844 控制器,通过特定协议控制 DI 和 DO 点。
- Excel 文件操作 使用
Microsoft.Office.Interop.Excel或其他 Excel 库来读写数据。 - 异常与超时处理:使用超时控制来确保每个步骤没有超时,并且可以在超时的情况下进行错误处理和显示。
2. 示例代码框架:
using System; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.Office.Interop.Excel; using System.Windows.Forms; public class TestAutomation { private static TcpClient tcpClient; // 用于连接基恩士扫码枪和耐压仪 private static NetworkStream networkStream; private static string excelFilePath = @"D:\Data.xlsx"; private static Application excelApp; private static Workbook workbook; private static Worksheet worksheet; private static ListView listView; // 用于显示状态 public static async Task Main(string[] args) { // 初始化 Excel 和 ListView 控件 InitializeExcel(); InitializeListView(); // 开始监听按钮 await WaitForStartButtonAsync(); } private static void InitializeExcel() { excelApp = new Application(); workbook = excelApp.Workbooks.Open(excelFilePath); worksheet = workbook.Sheets[1]; } private static void InitializeListView() { listView = new ListView(); // ListView 控件初始化 // 这里可以添加列等设置 } private static async Task WaitForStartButtonAsync() { // 等待 DI1 启动按钮 while (true) { if (IsDI1Pressed()) // 判断 DI1 是否按下 { await StartProcessAsync(); break; } await Task.Delay(100); // 每 100 毫秒检查一次 } } private static bool IsDI1Pressed() { // 这里需要根据 IO 控制器 ZLAN6844 获取 DI1 按钮状态 return true; // 模拟返回 DI1 按钮状态 } private static async Task StartProcessAsync() { try { // 发送 LON 命令触发扫码枪开始工作 await SendCommandToBarcodeScannerAsync("LON"); // 获取二维码并存储到 Excel 中 string qrCode = await GetQRCodeFromScannerAsync(); await StoreQRCodeInExcelAsync(qrCode); // 控制气缸动作 await ControlCylindersAsync(); // 获取电压电阻并存储到 Excel var (voltage, resistance) = await GetVoltageResistanceAsync(); await StoreVoltageResistanceInExcelAsync(voltage, resistance); // 完成流程,恢复初始状态 await ResetProcessAsync(); } catch (Exception ex) { // 错误处理 listView.Items.Add($"Error: {ex.Message}"); await ResetProcessAsync(); } } private static async Task SendCommandToBarcodeScannerAsync(string command) { // 发送 LON 命令到基恩士扫码枪 if (tcpClient == null) tcpClient = new TcpClient("192.168.1.100", 5000); // 假设扫码枪的 IP 和端口 networkStream = tcpClient.GetStream(); byte[] commandBytes = Encoding.ASCII.GetBytes(command); await networkStream.WriteAsync(commandBytes, 0, commandBytes.Length); } private static async Task<string> GetQRCodeFromScannerAsync() { // 从扫码枪获取二维码内容,模拟超时情况 string qrCode = string.Empty; CancellationTokenSource cts = new CancellationTokenSource(); Task receiveTask = Task.Run(async () => { byte[] buffer = new byte[1024]; int bytesRead = await networkStream.ReadAsync(buffer, 0, buffer.Length, cts.Token); qrCode = Encoding.ASCII.GetString(buffer, 0, bytesRead); }); // 设置超时 if (await Task.WhenAny(receiveTask, Task.Delay(10000)) == receiveTask) { cts.Cancel(); // 取消超时等待 } else { throw new TimeoutException("QR code scanning timed out."); } return qrCode; } private static async Task StoreQRCodeInExcelAsync(string qrCode) { // 存储二维码到 Excel 第2行第1列 worksheet.Cells[2, 1] = qrCode; workbook.Save(); } private static async Task ControlCylindersAsync() { // 控制气缸动作,模拟延时操作 await Task.Delay(1000); // 延时 1 秒 // 控制进退气缸、升降气缸动作的代码 } private static async Task<(double voltage, double resistance)> GetVoltageResistanceAsync() { // 向耐压仪发送命令并获取电压和电阻值 string command = "Result?"; await SendCommandToVoltageMeterAsync(command); // 模拟获取电压电阻值 double voltage = 3.7; double resistance = 10.5; return (voltage, resistance); } private static async Task SendCommandToVoltageMeterAsync(string command) { // 向 Chroma 19073 发送命令 byte[] commandBytes = Encoding.ASCII.GetBytes(command); await networkStream.WriteAsync(commandBytes, 0, commandBytes.Length); } private static async Task StoreVoltageResistanceInExcelAsync(double voltage, double resistance) { // 存储电压和电阻到 Excel 中 worksheet.Cells[2, 2] = voltage; worksheet.Cells[2, 3] = resistance; workbook.Save(); } private static async Task ResetProcessAsync() { // 恢复初始监听状态 listView.Items.Add("Process completed."); } }关键功能:
- 异步操作:扫码、耐压仪读取和控制气缸等操作都使用异步进行处理,以避免阻塞主线程。
- 通讯:通过
TcpClient和NetworkStream实现与设备的通讯(可以根据实际情况选择合适的协议)。 - 超时控制:通过
CancellationToken实现超时机制,防止操作挂起太长时间。 - Excel 操作:使用
Microsoft.Office.Interop.Excel操作 Excel 文件存储扫码、电压和电阻数据。 - 状态显示:使用
ListView控件动态显示状态和错误信息。
总结:
这个设计概述了如何在 C# 中实现自动化流程,涵盖设备控制、数据存储、超时检测和状态反馈等方面。根据你的需求,可以继续扩展代码,添加更复杂的控制逻辑、优化性能以及更好地处理硬件通讯和异常处理。
解决 无用评论 打赏 举报