当前位置: 首页 > article >正文

【C++】xml烧录 调用twinCat流程自动化

C++ 实现将日志记录保存到简单的 TXT 文件 中的示例代码,同时包括生成 EEPROM 配置文件自动调用 CLI 工具烧录及校验的功能。


1. 示例代码

完整代码示例:EEPROM 烧录与日志记录

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <ctime>
#include <cstdlib>

// 定义日志文件名
const std::string LOG_FILE = "eeprom_log.txt";

// 获取当前时间戳
std::string getCurrentTimestamp() {
    time_t now = time(0);
    tm *ltm = localtime(&now);
    char buffer[80];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ltm);
    return std::string(buffer);
}

// 日志记录函数
void logToFile(const std::string &deviceID, const std::string &operation, const std::string &status, const std::string &message) {
    std::ofstream logFile(LOG_FILE, std::ios::app); // 打开文件追加内容
    if (logFile.is_open()) {
        logFile << getCurrentTimestamp() << " | Device ID: " << deviceID
                << " | Operation: " << operation
                << " | Status: " << status
                << " | Message: " << message << std::endl;
        logFile.close();
    } else {
        std::cerr << "无法打开日志文件。" << std::endl;
    }
}

// 生成 EEPROM 配置文件
void generateEepromFile(const std::string &deviceID, const std::string &outputFile) {
    std::ofstream configFile(outputFile); // 打开输出文件
    if (configFile.is_open()) {
        configFile << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
        configFile << "<Eeprom>\n";
        configFile << "  <ByteSize>2048</ByteSize>\n";
        configFile << "  <ConfigData>" << deviceID << "000000000000080000</ConfigData>\n";
        configFile << "  <BootStrap>001080080108000</BootStrap>\n";
        configFile << "  <Timestamp>" << getCurrentTimestamp() << "</Timestamp>\n";
        configFile << "</Eeprom>\n";
        configFile.close();
        std::cout << "生成 EEPROM 配置文件:" << outputFile << std::endl;
        logToFile(deviceID, "Generate Config", "Success", "配置文件已生成");
    } else {
        std::cerr << "无法创建配置文件。" << std::endl;
        logToFile(deviceID, "Generate Config", "Failed", "无法创建配置文件");
    }
}

// 执行 CLI 命令
bool executeCommand(const std::string &command, std::string &output) {
    char buffer[128];
    std::ostringstream result;
    FILE *pipe = popen(command.c_str(), "r"); // 执行命令
    if (!pipe) {
        output = "命令执行失败";
        return false;
    }

    while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {
        result << buffer;
    }

    int status = pclose(pipe); // 关闭命令管道
    output = result.str();
    return status == 0; // 返回成功或失败状态
}

// 烧录 EEPROM 数据
void writeEeprom(const std::string &deviceID, const std::string &deviceAddress, const std::string &configFile) {
    std::string output;
    std::string command = "TcCmd WriteEeprom " + deviceAddress + " " + configFile; // CLI 命令
    if (executeCommand(command, output)) {
        logToFile(deviceID, "Write", "Success", "数据烧录成功");
    } else {
        logToFile(deviceID, "Write", "Failed", "烧录失败:" + output);
    }
}

// 校验 EEPROM 数据
void verifyEeprom(const std::string &deviceID, const std::string &deviceAddress, const std::string &configFile) {
    std::string output;
    std::string command = "TcCmd VerifyEeprom " + deviceAddress + " " + configFile; // CLI 校验命令
    if (executeCommand(command, output)) {
        logToFile(deviceID, "Verify", "Success", "校验成功");
    } else {
        logToFile(deviceID, "Verify", "Failed", "校验失败:" + output);
    }
}

// 主函数
int main() {
    // 示例设备信息
    std::string deviceID = "8D0E84CC";
    std::string deviceAddress = "0x1000";
    std::string configFile = "EEPROM_Config_" + deviceID + ".xml";

    // 1. 生成 EEPROM 配置文件
    generateEepromFile(deviceID, configFile);

    // 2. 烧录 EEPROM 数据
    writeEeprom(deviceID, deviceAddress, configFile);

    // 3. 校验 EEPROM 数据
    verifyEeprom(deviceID, deviceAddress, configFile);

    std::cout << "操作完成,日志已保存到 " << LOG_FILE << std::endl;
    return 0;
}

2. 代码说明

  1. 日志管理:

    • 使用 ofstream 将日志信息按时间戳记录到 eeprom_log.txt 中。
    • 每次操作都会记录结果,便于后期追溯。
  2. 配置文件生成:

    • 使用 XML 格式创建配置文件,包含设备 ID、配置参数和时间戳信息。
  3. CLI 命令执行:

    • 使用 popen 调用 TwinCAT CLI 命令(如 TcCmd WriteEepromTcCmd VerifyEeprom)。
    • 捕获命令输出,并将成功或失败的结果写入日志文件中。
  4. 自动化流程:

    • 自动依次执行生成配置 → 烧录数据 → 校验数据,无需人工干预。

3. 日志示例输出

eeprom_log.txt 内容示例:

2024-01-08 10:30:00 | Device ID: 8D0E84CC | Operation: Generate Config | Status: Success | Message: 配置文件已生成
2024-01-08 10:31:00 | Device ID: 8D0E84CC | Operation: Write | Status: Success | Message: 数据烧录成功
2024-01-08 10:32:00 | Device ID: 8D0E84CC | Operation: Verify | Status: Failed | Message: 校验失败:数据不匹配

4. 关键注意事项

  1. 命令环境:

    • 确保 TwinCAT CLI 工具(TcCmd)已安装,并设置到环境变量 PATH 中。
  2. 日志文件安全:

    • 处理日志文件大小时,可以加入文件滚动功能,防止日志文件过大。
  3. 错误处理:

    • 如果设备未连接或 CLI 工具执行失败,应及时输出错误信息并记录到日志。
  4. 跨平台兼容性:

    • 当前代码基于 Windows 环境开发。如果需要支持 Linux,需要调整命令执行部分。

5. 小结

  • 该 C++ 代码实现了 EEPROM 配置生成CLI 自动烧录和校验日志记录到 TXT 文件 的功能。
  • 支持流程自动化,并通过日志追踪每一步操作结果,适合生产或调试环境使用。

http://www.kler.cn/a/487789.html

相关文章:

  • xml简介
  • 使用 C++ 实现神经网络:从基础到高级优化
  • Vue3(elementPlus) el-table替换/隐藏行箭头,点击整行展开
  • 【简博士统计学习方法】第1章:2. 统计学习方法的基本分类
  • js实现一个可以自动重链的websocket客户端
  • Clickhouse基础(一)
  • [免费]微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端)【论文+源码+SQL脚本】
  • 问题清单:@DS数据库配置注解失效
  • 标题: [原创](Modern C++)现代C++的关键性概念: 初步了解std之下的几个常用子命名空间
  • DockerCompose玩转Kafka单体与集群部署,Redpanda Console助力可视化管理
  • 5.在 Vue 3 中使用 ECharts 实现菱形渐变雷达图
  • C# 队列的各种使用方法 private static ConcurrentQueue
  • 《跨西伯利亚铁路模拟器抢先版》Build16645718官方中文学习版
  • GPTs与鸿蒙HarmonyOS应用开发的深度融合:探索与实践
  • 1. 使用springboot做一个音乐播放器软件项目【前期规划】
  • 28.Java 实现线程间定制化通信
  • 学英语学压测:08 jmeter html测试报告测试报告的3种生成方式
  • linux截取日志信息
  • Nginx:HTTP 方法控制
  • 解决idea中无法拖动tab标签页的问题
  • [Unity]发包前遇到的坑之GridLayoutGroup
  • Nginx不支持HTTP请求头中包含下划线_的解决办法
  • 详解 Docker 启动 Windows 容器第一篇:多种方式及实用配置指南
  • [IoT]详细设计:智能农业监控系统
  • LabVIEW轴承性能测试系统
  • 【HTML+CSS+JS+VUE】web前端教程-27-弹性盒模型(flex box)