我前段时间在做一个工程,此工程所有的设备运行数据都需要实时更新到数据库中,设备总共有100台左右,分为6种不同的设备,每种设备记录的数据种数一样,如所有的输送机都是电流、功率、温度、状态、报警码等。我开始使用的方法是,每一种设备一张表,每10秒向表中插入数据,用循环的方式,先插入设备1,再到设备2,以次循环插完全部设备数据。这些执行的脚本全部都是用C语言来写的,如下是执行的插入语句,相应的变量值通过循环付值,再循环执行下面的插入语句。
sprintf( sql,"insert into \"UA#BeltConveyor_RE\" (UserName,DeviceName,DeviceNumber, Device_type,State,Alarm, CurrentA,Power,Production,Flow,DateTime) values (N'%s',N'%s',%d,N'%s',%d,%d,%0.2f,%0.2f,%ld,%ld,'%s')",UserName,name,number,type,state,alarm,A,power,production,flow,dt_modify);
ODBC_Command(DSNR,sql);//插入配方信息到***表中
测通后投入运行使用,发现这些功能做进来后,系统运行很慢,而且容易卡死,最后把这种脚本方式的改成了西门子自带的归档功能,每个设备对应一张表,能过归档功能的变量关连到设备的变量,这样才OK。
经测试和分析,总结了两点,一是wincc运行循环周本很费时间,导致系统很慢;二是因为数据量大,数据库中的表无法自动压缩,西门子自带功能的归档是可以自动压缩的,可能这也是其中一个原因吧。
请教一下各路高手,有没有更简易的方法实现这样的功能,请多多发表经验及见解。谢谢!