触摸屏,wincc,威伦通数据库连接,MYSQL,范例程序,历史报表程序

最近在折腾触摸屏的历史报表功能,发现工业场景里用MySQL存数据是真香。今天拿WinCC和威伦通(Weintek)这俩常见组态软件举个栗子,手把手整点能跑的代码。

先看WinCC这边,VBS脚本操作MySQL是真刺激。在全局脚本里整个定时器,每分钟存个当前温度值:

Sub StoreData()
    Dim conn, rs
    Set conn = CreateObject("ADODB.Connection")
    conn.ConnectionString = "DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=192.168.1.100;DATABASE=scada;UID=root;PWD=123456;"
    conn.Open
    
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open "INSERT INTO history (timestamp, tag1) VALUES (NOW(), " & SmartTags("Temperature") & ")", conn
    
    rs.Close
    conn.Close
End Sub

这段代码里的坑得注意:1.ODBC驱动版本要和MySQL对应;2.字符串要用Unicode驱动;3.SmartTags对象是WinCC内置的。要是报错"找不到数据源",八成是没在ODBC数据源管理器里配好系统DSN。

转战威伦通EBPro,Lua脚本操作数据库更带劲。在HMI上搞个按钮触发存储:

function onPress()
    local db = mysql.connect("192.168.1.100", "root", "123456", "scada", 3306)
    if db then
        local current_value = get_tag("Pressure")
        local query = string.format("INSERT INTO history SET value=%.2f, time=NOW()", current_value)
        mysql.query(db, query)
        mysql.close(db)
    else
        print("数据库连接失败!")
    end
end

这里有个骚操作:威伦通的mysql库是内置的,不用额外装驱动。但要注意浮点数精度问题,用string.format控制小数位更稳。实测发现直接拼SQL字符串容易出类型错误,建议数值型数据强制转换。

历史报表展示可以用Web组件偷个懒,整个PHP中间层:

<?php
$conn = new mysqli("localhost", "root", "123456", "scada");
$result = $conn->query("SELECT DATE_FORMAT(time,'%Y-%m-%d %H:%i') as dt, AVG(value) FROM history GROUP BY dt");
while($row = $result->fetch_assoc()){
    echo "<tr><td>{$row['dt']}</td><td>{$row['value']}</td></tr>";
}
?>

把这脚本丢到HMI的Web服务器里,组态画面里嵌个浏览器控件,URL指向本地服务器地址,自动刷新搞定。比用自带报表控件灵活,还能自定义CSS样式。

最后说几个血泪教训:工业现场MySQL最好设置自动重连;时间戳字段建议用数据库的NOW()生成;威伦通的Lua脚本处理日期比较时记得用os.date("%Y-%m-%d %H:%M:%S")格式化。搞工业数据库千万别在代码里写死密码,建议单独做配置文件,你永远不知道甲方什么时候要改密码...

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐