2401_89673708 2025-01-17 15:51 采纳率: 33.3%
浏览 13

Port1触发基恩士SR-751扫码和Port2触发Chroma19073读电压电阻

请教一下
工程流程描述如下:
将第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 升降气缸

  • 写回答

2条回答 默认 最新

  • 猿享天开 优质创作者: 编程框架技术领域 2025-01-17 15:59
    关注

    根据你提供的流程描述,这是一个基于设备通讯和物理控制的自动化测试系统,涉及多个设备的操作,包括扫码枪、耐压仪、气缸控制等,同时还需要与Excel文件交互来存储扫描到的数据。

    在 C# 中实现这个系统,我们需要使用以下步骤来完成整个流程:

    关键技术点

    1. 通讯与控制

      • 使用网口进行通讯,特别是通过 Port1 与基恩士 SR-751 扫码枪通讯,Port2 与 Chroma 19073 耐压仪通讯。
      • 控制 IO 控制器(ZLAN6844)上的输入和输出点,通过 DI 和 DO 点控制设备(气缸的动作、按钮状态等)。
    2. 设备通信协议

      • 使用基恩士扫码枪 SR-751,发送特定命令(如 LON 命令)进行扫码。
      • 使用 Chroma 19073 耐压仪,发送命令(如 Result? 命令)获取电压和电阻值。
    3. Excel 数据存储

      • 将二维码内容、电压、电阻值存储到 Excel 文件中的指定单元格。
    4. 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.");
        }
    }
    

    关键功能:

    1. 异步操作:扫码、耐压仪读取和控制气缸等操作都使用异步进行处理,以避免阻塞主线程。
    2. 通讯:通过 TcpClientNetworkStream 实现与设备的通讯(可以根据实际情况选择合适的协议)。
    3. 超时控制:通过 CancellationToken 实现超时机制,防止操作挂起太长时间。
    4. Excel 操作:使用 Microsoft.Office.Interop.Excel 操作 Excel 文件存储扫码、电压和电阻数据。
    5. 状态显示:使用 ListView 控件动态显示状态和错误信息。

    总结:

    这个设计概述了如何在 C# 中实现自动化流程,涵盖设备控制、数据存储、超时检测和状态反馈等方面。根据你的需求,可以继续扩展代码,添加更复杂的控制逻辑、优化性能以及更好地处理硬件通讯和异常处理。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月17日