恭喜,你发布的帖子
发布于 2017-12-01 11:33:32
4楼
#include "apdefap.h"
int gscAction( void )
{
#pragma option(mbcs)//设置WINCC的C脚本编译器支持多字节字符集
#pragma code ("kernel32.dll")
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);//获取当地的当前系统日期和时间
SYSTEMTIME sysTime;//系统时间
#pragma code ()
static int i = 1;//行数,i只定义等于1一次,i留存在程序中(赋值语句i=1)
int oneTime = 100;// 一次写入50行
int end;
char Name[100] = " ";//年月日时分秒长度 []数组
char DATEC[100] = " ";//日期长度
double tag[50]; //略
char tagName[18];//变量名的长度 数据变量名长度
int ii;//与列相关的中间变量
int totalTag = 200;//一个周期的行数
int val;//每行变量的名称比如 SJ_001 数据变量名
int totalRow = 999999;//写入行的总数
int colCount = 9;//列数
double value;//采集变量 值 数据变量数值(mm)
int flag = 0;//写入控制
char backup[100];//备份文件位置(路径\名称)
FILE *fpUser;//文件指针用户
FILE *fpBackup;//文件指针备份
int start = 301;//首次从此写数据
int xiaoshi;//小时变量
int fen;//分变量
int miao;//秒变量
int mills;//毫秒变量
char name[50];//用户文件位置(路径\名称)
int brk = 0;
int b;//重启变量
char head[] = "年月日,时分秒,毫秒,速度1,位置1,入口压力,出口压力,参考牵引力,比例阀信号,蓄能压力,速度2,位置2";
int round = 0;
label://goto至此位置
i = 1;//行数重启置i=1从PLC数据行数重写)
GetLocalTime(&sysTime);//取系统时间
sprintf(DATEC,"%4d%02d%02d%02d%02d%02d",sysTime.wYear,sysTime.wMonth,sysTime.wDay, sysTime.wHour,sysTime.wMinute, sysTime.wSecond);//赋值
;
sprintf(name, "d:\\USER\\%4d%02d%02d%02d%02d%02d.csv",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute, sysTime.wSecond);
sprintf(backup, "d:\\SYS_SJ\\%4d%02d%02d%02d%02d%02d.csv",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute, sysTime.wSecond);
mills = 0;//0ms开始
miao = sysTime.wSecond;//s取出
fen = sysTime.wMinute;//m取出
xiaoshi = sysTime.wHour;//小时取出
mills= rand() % 999;//ms/999余数
printf("begin");
while(1)
{
if(i >= totalRow) break;
while(flag == 0){flag = GetTagBit("flag" );}//写入控制点
brk = GetTagBit("break" );
if(brk == 1) break;
fpUser = fopen(name, "a+");//直接追加写入,没有这个文件就创建(a.csv)用户
fpBackup = fopen(backup, "a+");//直接追加写入,没有这个文件就创建(a.csv)备份
flag = 0;//c控制变量置零
SetTagBit("flag", 0);//将外部控制写入变量置零
b = GetTagBit("b");//取b值
if(b == 1) {
b = 0;
SetTagBit("b", 0);//把b置为0
goto label;//跳出循环至label
}
end = i + oneTime;//下一个DB块首行数
++round;
if(i == start) {
// fprintf(fpTmp, "\n");
fprintf(fpUser, head);//往文件里写表头项目名称用户
fprintf(fpBackup, head);//往文件里写表头项目名称备份
fprintf(fpUser, "\n");//回车一行 用户
fprintf(fpBackup, "\n");//回车一行 备份
SetTagChar("user1", name);//打开表格路径字符串变量
// start = 1;//第一次200行以后,下一次从头写
}
while(i < end && i < totalRow) {//小于每行100与小于90000同时满足
if(i == start) {
GetLocalTime(&sysTime);
mills = 0;//0ms开始
miao = sysTime.wSecond;//s取出
fen = sysTime.wMinute;//m取出
xiaoshi = sysTime.wHour;//小时取出
printf("\n%02:%02d:%02d\n", xiaoshi, fen, miao);
}
if(i >= start)//首次大于200 后大于1
{
fprintf(fpUser, "%4d-%02d-%02d,%02d:%02d:%02d,%3d,",sysTime.wYear,sysTime.wMonth,sysTime.wDay,xiaoshi, fen, miao, mills);//往用户表写时间
fprintf(fpBackup, "%4d-%02d-%02d,%02d:%02d:%02d,%3d,",sysTime.wYear,sysTime.wMonth,sysTime.wDay,xiaoshi, fen, miao, mills);//往备分表写时间
}
for(ii = 0; ii < colCount; ++ii) {//循环写入一行每个列
val = ii * totalTag + (i - 1)% totalTag + 1;//SJ_00x数据名称的位置关系
sprintf(tagName, "SJ_%04d", val);//拼字符串
value = GetTagDouble(tagName);//取写入的数据
if(i >= start)//首次大于200 后大于1
{
fprintf(fpUser, "%f,", value);//往用户表写入所取数据
fprintf(fpBackup, "%f,", value);//往备份表写入所取数据
}
}
if(i >= start) //首次大于200 后大于1
{
fprintf(fpUser, "\n");//每行后回车
fprintf(fpBackup, "\n");//每行后回车
}
SetTagDouble("row", i);//往外导出行数
mills=mills +30;//ms递增30ms
if (mills>999)//ms 大于999
{
mills=mills-1000;//ms-1000
miao=miao+1;//s加1
}
if (miao>59)//s大于59
{
miao=miao-60;//s-60
fen=fen+1;//m加1
}
if (fen>59)//m大于59
{
fen=fen-60;//m-60
xiaoshi=xiaoshi+1;}//h加1
++i;//换行
}
fclose(fpUser);//把缓冲区数据写入文件里后关闭
fclose(fpBackup);//把缓冲区数据写入文件里后关闭
请填写推广理由:
分享
只看
楼主