电工学习网

 找回密码
 立即注册
查看: 1308|回复: 0
打印 上一主题 下一主题

电源管理系统Modbus通讯

[复制链接]
跳转到指定楼层
楼主
发表于 2021-1-12 19:40:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
现场发电机采用WOODWARD的EGCP-3作为主控制器,通过EGCP-3和2301-D控制柴油机的转速,实现转速平稳控制,EGCP-3和BASLE电气的DECS-100,来控制发电机的励磁信号,使发电机输出电压平稳。功率管理系统使用CP341作为通信接口和EGCP-3进行基于MOUDBUS通讯协议的通讯,分别读取发电机电压,电流,运行状态,报警状态,故障信息代码,并列运行状态,功率分配等信息,并且按照功率管理系统的计算结果,对并列发电机进行起机和并列运行操作,对解列发电机停车操作。
电源管理系统Modbus通讯
电源管理系统Modbus通讯

首先,安装西门子的例程,进行单从站的通讯测试。
然后,多从站的读操作;
测试没有问题后,当时也没特殊需求,就直接发到船厂了。
结果,现场又提了远程操作需求,这样的话涉及给从站写命令。所以,
继续单机写操作,没有毛病;
多机写操作,也没有问题。
然后当把读写程序都开放测试时,问题出现了。
当写操作进行时,读操作会偶发性的中断,两个通讯请求的时序匹配问题,导致读上来的参数混乱。
电源管理系统Modbus通讯

电源管理系统Modbus通讯


后来把读写通讯优化才得以解决。把读写放到一个判断跳转块中。
L     6
      T     "SendLength"

      L     "Data_Segment_Index"
      JL    LSTX
      JU    SEG0
      JU    SEG1
      JU    SEG2
      JU    SEG3
      JU    SEG4
      JU    SEG5
      JU    SEG6
      JU    SEG7                        //写数据
LSTX: JU    end

//fuction code is 2 Read Input Status
SEG0: L     "GEN_No"
      T     "SOURCE_DB".slave_address
      L     2
      T     "SOURCE_DB".function_code
      L     6
      T     "SOURCE_DB".DATA_ADDR
      L     32
      T     "SOURCE_DB".DATA_LENGTH

      L     0                           //0,1,2,3
      T     "RecvDataOffset"            //DBB_NO. the received blocks start address

      JU    end

//fuction code is 2 Read Input Status
SEG1: L     "GEN_No"
      T     "SOURCE_DB".slave_address
      L     2
      T     "SOURCE_DB".function_code
      L     38
      T     "SOURCE_DB".DATA_ADDR
      L     32
      T     "SOURCE_DB".DATA_LENGTH

      L     4                           //4,5,6,7
      T     "RecvDataOffset"
      JU    end

//fuction code is 2 Read Input Status
SEG2: L     "GEN_No"
      T     "SOURCE_DB".slave_address
      L     2
      T     "SOURCE_DB".function_code
      L     81
      T     "SOURCE_DB".DATA_ADDR
      L     32
      T     "SOURCE_DB".DATA_LENGTH

      L     8                           //8,9,10,11
      T     "RecvDataOffset"
      JU    end

SEG3: L     "GEN_No"
      T     "SOURCE_DB".slave_address
      L     2
      T     "SOURCE_DB".function_code
      L     136
      T     "SOURCE_DB".DATA_ADDR
      L     32
      T     "SOURCE_DB".DATA_LENGTH

      L     12                          //12,13,14,15
      T     "RecvDataOffset"
      JU    end

SEG4: L     "GEN_No"
      T     "SOURCE_DB".slave_address
      L     4
      T     "SOURCE_DB".function_code
      L     5
      T     "SOURCE_DB".DATA_ADDR
      L     24
      T     "SOURCE_DB".DATA_LENGTH

      L     20                          //20-66word
      T     "RecvDataOffset"
      JU    end

SEG5: L     "GEN_No"
      T     "SOURCE_DB".slave_address

      L     4
      T     "SOURCE_DB".function_code

      L     58
      T     "SOURCE_DB".DATA_ADDR

      L     24
      T     "SOURCE_DB".DATA_LENGTH

      L     68                          //68--114
      T     "RecvDataOffset"
      JU    end

SEG6: L     "GEN_No"
      T     "SOURCE_DB".slave_address
      L     4
      T     "SOURCE_DB".function_code
      L     106
      T     "SOURCE_DB".DATA_ADDR
      L     24
      T     "SOURCE_DB".DATA_LENGTH

      L     116                         //116--164
      T     "RecvDataOffset"
      JU    end

//写数据到EGCP
SEG7: NOP   0

      A     "Mode_Write_Modma".GEN5_Mode_W_R
      JCN   _w5
      L     5
      T     "GEN_No"
_w5:  NOP   0

说起来貌似很惬意,很轻松,但是当时确实费了不少功夫。看看我的备份程序记录:
电源管理系统Modbus通讯

EGCP-3要求auto=1, run=0时可由Modbus远程启停机,即此情况下才能执行网络写操作。
当前的情况是本地开关在STANDBY模式下,可以通过网络进行AUTO,OFF,STANDBY的切换。
当前的EGCP-3输出auto,run ,test状态虽然读到hmi上,但是只有本地开关在除了STANDBY以外的位置时,读到的状态和本地开关的位置一致;
当本地开关置于STANDBY时,经过网络写操作,读上来的状态有可能为OFF,STANDBY,AUTO。
也就是说,如果不知道本地开关的状态,只依据网络读上来的状态,并不能判断本地开关处于什么位置。
电源管理系统Modbus通讯

现在的解决方法是:把各个本地开关的STANDBY信号引入plc的DI端子,这样无论读上来的EGCP是什么状态,都能判断本地开关处于什么位置。
电源管理系统Modbus通讯
来源:西门子工业技术论坛

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-5-5 07:39

Powered by © 2011-2022 www.diangon.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表