项目安装与运行完整流程 1. 克隆源码 首先,你需要克隆项目源码到本地: git clone <repository_url> cd xxx 2. 安装依赖 项目需要安装一系列依赖包,根据目标平台执行不同的准备命令: Linux 平台 make prepare ARCH=linux ARM 平台 (em-500) make prepare ARM64 平台 (em-1000) make prepare ARCH=arm64 3. 构建项目 根据目标平台执行构建命令: Linux 平台 make all ARCH=linux ARM 平台 (em-500) make all ARM64 平台 (em-1000) make all ARCH=arm64 4. 准备数据库 对于 Linux 平台,需要初始化数据库: make prepare-db 5. 运行项目 Linux 平台运行 ./bin/zyems -r config -d tmp/zyems.db -p 8080 ARM 平台 (em-500) 运行 make run ARM64 平台 (em-1000) 运行 make run ARCH=arm64 6. 测试 API 在 VSCode 中安装 REST Client 插件 打开项目中的 test 目录下的 ApiTest.http 文件 选择测试用例,点击 “Send Request” 进行测试 7. 生成文档 如果需要生成项目文档: ...
Posts
锦浪逆变器模拟器整体逻辑详解 我来详细分解锦浪逆变器模拟器的整体逻辑,让你彻底搞明白它是如何工作的。 一、整体架构 锦浪模拟器的核心架构分为以下几个部分: 数据点配置:定义寄存器地址和数据点信息 设备类:处理Modbus通信和数据管理 数据同步:在设备和数据点站之间同步数据 仿真线程:模拟数据的动态变化 数据上报:将数据上报给上层系统 二、详细工作流程 1. 初始化阶段 步骤1:设备创建 当系统启动时,通过设备工厂创建锦浪模拟器实例 调用CJinLang()构造函数 初始化监听器和寄存器映射 步骤2:注册设备类型 通过静态初始化块,将锦浪设备类型注册到设备工厂 这样系统就知道如何创建锦浪模拟器实例 步骤3:初始化设备 调用DoInit()方法 注册各种事件监听器 启动仿真线程(如果启用) 调用CSimulator::DoInit()初始化数据点 2. Modbus通信处理 步骤1:接收Modbus请求 当外部系统发送Modbus请求时,HandleRequest()方法被调用 解析请求的功能码、起始地址和数量 步骤2:处理请求 检查地址范围是否合法 复制对应的寄存器数据到响应中 返回处理结果 步骤3:响应Modbus请求 将处理好的数据发送回请求方 3. 数据同步机制 步骤1:数据点站数据更新 当数据点站中的数据发生变化时,触发OnDataPointUpdated回调 调用HandleDataPointUpdated()方法处理数据更新 步骤2:同步到设备 将数据点站中的数据同步到设备的成员变量 同步到Modbus寄存器 步骤3:设备数据更新 当设备的成员变量发生变化时,触发OnMemberUpdated回调 调用HandlerMemberUpdated()方法处理成员变量更新 同步到Modbus寄存器 上报数据点更新 4. 仿真线程工作原理 步骤1:启动仿真线程 调用StartSimulatorThread()方法 创建并启动SimulationStep()线程 步骤2:定期更新数据 SimulationStep()方法每0.5秒执行一次 调用UpdateSimulatorData()方法更新数据 步骤3:获取随机数据 UpdateSimulatorData()从数据点站获取随机生成的值 更新设备的成员变量 更新Modbus寄存器 上报所有数据点 5. 数据上报流程 步骤1:准备数据 ReportAllDataPoints()方法遍历所有数据点 获取每个数据点的当前值 步骤2:发送通知 为每个数据点创建一个通知 调用m_pWatcherManager->Notify()发送通知 通知包含数据点名称和值 步骤3:上层系统处理 ...
理解如何根据协议配置数据点是模拟器开发的关键部分。让我用通俗易懂的方式为您讲解,并以“日发电量”为例详细说明每个参数的填写方法。 一、m_vStModbusDataPointExs 字段含义 m_vStModbusDataPointExs 是一个数组,每个元素代表一个数据点的配置,包含11个字段: 序号 字段名称 含义 示例(日发电量) 1 数据点名称 在代码和EMS中使用的标识符 “daily_generation” 2 数据点地址 相对于起始地址的偏移量 3014 - 2999 = 15 3 数据点数据长度 寄存器数量(1=16位,2=32位) 1(U16) 4 数据点变比系数 实际值 = 寄存器值 / 变比 10(0.1kWh) 5 数据点偏移量 实际值 = 寄存器值/变比 + 偏移 0.0 6 设备寄存器地址 协议中定义的物理地址 3014 7 寄存器访问类型 INPUT_REG(输入寄存器)或 HOLDING_REG(保持寄存器) INPUT_REG 8 成员变量指针 对应设备类中的成员变量 &m_fDailyGeneration 9 成员变量类型 成员变量的数据类型 E_TYPE_FLOAT 10 寄存器存储类型 寄存器中存储的数据类型 E_TYPE_INT16 11 同步类型 数据同步方式 SIMULATOR_CHANGE 二、“日发电量”配置详解 根据协议:3014 当日发电量 U16 0.1kWh ...
非常理解您作为零基础学习者的困惑!让我用通俗易懂的方式为您讲解这些概念,并提供学习方向。 一、基础概念通俗解释 1. 寄存器是什么? 生活例子:寄存器就像一个个小盒子,每个盒子可以存放一个数字。 16位寄存器:一个小盒子,最多能放0-65535之间的数字(相当于一个4位密码锁,每位0-9,最多9999) 32位寄存器:一个大盒子,最多能放0-4294967295之间的数字(相当于一个8位密码锁) 2. 为什么需要多个寄存器? 生活例子:如果要存一个很大的数字,比如123456,4位密码锁放不下,需要用两个4位密码锁:第一个放12,第二个放3456。 单寄存器:16位,直接放一个小数字 双寄存器:两个16位寄存器,合起来放一个大数字(32位) 3. 高低位是什么? 生活例子:比如数字1234,12是高位,34是低位。 高位:数字的左边部分 低位:数字的右边部分 4. 负数怎么处理? 生活例子:温度计,0以上是正数,0以下是负数。在计算机中,用最高位表示符号(0为正,1为负)。 16位有符号数:范围是-32768到32767 32位有符号数:范围是-2147483648到2147483647 二、锦浪代码详细解释 1. MODBUS_FC_WRITE_SINGLE_REGISTER(写单个寄存器) 功能:往一个16位寄存器里写数据 代码步骤: 地址检查:确保要写入的地址在有效范围内(比如盒子编号不能超过仓库容量) 加锁:防止多线程同时操作(相当于一个人操作时,其他人不能动) 写入数据:把数据放到对应位置的寄存器(把数字放进盒子) 查找数据点:找到这个寄存器对应的设备参数(比如找到这个盒子是存什么的) 转换数据:把寄存器的原始值转换成实际值(比如盒子里存的是温度的倍数,需要转换) 更新成员变量:更新设备内部的变量值(记录到设备的“大脑”里) 通知数据点站:告诉系统数据已经更新(通知管理员数据变了) 2. MODBUS_FC_WRITE_MULTIPLE_REGISTERS(写多个寄存器) 功能:往多个寄存器里写数据,主要用于32位数据 代码步骤: 地址检查:确保地址范围有效 加锁:防止并发操作 写入数据:把数据放到多个寄存器里(比如把大数字分成两部分放进两个盒子) 处理32位数据: 高16位:数字的左边部分 低16位:数字的右边部分 组合成32位整数:把两部分合起来 处理限功率逻辑:如果限功率开关开启,根据调节值更新额定功率 通知数据点站:告诉系统数据已经更新 三、核心代码解析(用生活例子) 1. 32位数据处理 // 正确处理32位有符号整数 int16_t highWord = static_cast<int16_t>(cmd.m_nValue[0]); // 高16位(左边部分) uint16_t lowWord = cmd.m_nValue[1]; // 低16位(右边部分) int32_t intValue = (static_cast<int32_t>(highWord) << 16) | static_cast<uint32_t>(lowWord); // 组合成32位 生活例子: 要存数字12345678,分成两部分:1234和5678 高16位放1234,低16位放5678 组合时,把1234左移4位(相当于12340000),然后加上5678,得到12345678 2. 负数处理 int16_t highWord = static_cast<int16_t>(cmd.m_nValue[0]); // 对高16位进行符号扩展 生活例子: 温度计显示-10度,在寄存器中可能存的是一个特殊的二进制数 用static_cast<int16_t>可以正确识别这个特殊数,转换成-10 四、需要学习的相关知识 1. C++基础 数据类型(int、float、uint16_t等) 类型转换(static_cast等) 位运算(«、|等) 多线程(mutex、lock_guard等) 2. 计算机基础 二进制、十进制转换 有符号数和无符号数 位操作(左移、右移、与、或等) 3. Modbus协议 Modbus功能码(03、04、06、16等) 寄存器地址和数据格式 数据传输规则 五、学习资源推荐 1. C++入门 《C++ Primer》(第5版):经典入门书籍 C++ 教程 - 菜鸟教程:在线教程 C++ 参考手册 - cppreference.com:权威参考 2. 计算机基础 《计算机组成原理》(唐朔飞):讲解计算机内部工作原理 计算机科学速成课:B站视频教程 3. Modbus协议 《MODBUS协议中文版》:详细介绍Modbus协议 Modbus官网:官方文档 Modbus协议详解:博客教程 六、学习建议 从基础开始:先学C++基础,再学计算机基础,最后学Modbus协议 多写代码:通过实际编写代码来理解概念 调试代码:使用调试工具观察数据变化 参考例子:看其他设备的实现代码,比如英博、恩玖 循序渐进:先理解单寄存器,再理解多寄存器,最后理解32位数据处理 希望这些解释对您有帮助!如果有具体的问题,随时告诉我,我会进一步详细解答。 ...
储能EMS系统策略生效操作文档 防逆流策略 EMS-新建设备 新建 PCS 设备、电表-负载、电表-市电三类设备。 PCS 设备 电表-内(负载) 电表-外(市电) 模拟器-新建设备 在模拟器中创建对应设备后,需要将三类设备的总有功功率设置为固定值,PCS 设备设为 100kW、电表-内(负载)设为 80kW、电表-外(市电)设为 20kW。 可以在运行概览页面查看各系统运行状态。 防逆流策略中电网供电功率限制值设为 5kW,即要求电网供电功率最低值为 6kW,当电网供电功率小于 6kW 时,将触发防逆流策略生效。 接下来,将 PCS 设备的总有功功率从 100kW 修改为 -100kW(即放电 100kW,该值大于负载设置的 80kW)。 初始状态下,电表 - 外(市电)功率为 20kW,大于 6kW 的最低要求,满足正常运行条件;需将其修改为 3kW(小于 6kW),此时会触发防逆流策略。可观察到 PCS 设备自动调节功率,从放电 100kW 开始平滑降低放电功率,即代表防逆流策略已生效。 防逆流策略触发后,系统会平滑调整储能系统功率。如果功率调节失败,系统将触发告警。 削峰填谷策略 削峰填谷是储能系统不同时间段设置的行为,用电高峰期放电,用电低峰期充电。 在策略管理,选择削峰填谷测量,设置一个新的策略,为了方便快速验证,可以设置为三个时间段不同的状态,可以设置为每个时间段就1分钟。如下所示: 然后,我们可以看到,不同的时间段,储能系统是有状态同步发生改变了的。 充电 1000 kw 待机 放电 100 kw 需量控制策略 需量控制是储能系统从电网取电是有额度的,不可用多了,也不能用少了。