307900508
级别: 略有小成
精华主题: 0
发帖数量: 303 个
工控威望: 338 点
下载积分: 1957 分
在线时间: 70(小时)
注册时间: 2021-05-29
最后登录: 2026-06-06
查看307900508的 主题 / 回贴
楼主  发表于: 15小时前
    同仁们早上好,你做过工程机械的没?最近做个项目用硕博电子7寸屏 EXCEL 数据文件存储和USB导出,现在发现在不断电的情况下可连续USB导出2次,第三次就无法导出,确保屏内有存储到数据,最后发现断一次电就可以考出来,但同样也出2次过后就没法在导出,必须断一次电,有那位高手指导一下?程序如下:
ton_t(in:=NOT ton_t.Q,pt:=T#3S);//总定时
//U盘检测程序
CheckUsb(
    xExecute:=ton_t.Q  ,
    xDone=> ,
    xBusy=> ,
    xError=> ,
    sDirName:='/tmp/usb',
    eError=> ,
    hDir=> );

IF CheckUsb.xDone THEN dirfile:=CheckUsb.hDir;CheckUsbOk:=TRUE;InfoEnable:=TRUE;TXT:=1;END_IF
IF CheckUsb.xError THEN CheckUsbOk:=FALSE;InfoEnable:=FALSE;TXT:=0;  END_IF

USBInfo(
    xExecute:=InfoEnable,
    xDone=> ,
    xBusy=> ,
    xError=> ,
    hDir:=dirfile,
    eError=> ,
    deDirEntry=> );


i_t(in:=NOT i_t.Q,pt:=T#1S);

IF i_t.q THEN i:=i+1;END_IF

IF i>10 THEN i:=1;END_IF


DownLoad_r(clk:=DownLoad_Enable);

IF DownLoad_r.Q AND CheckUsbOk THEN Enable:=TRUE;END_IF

DownLoad(
    xExecute:=Enable,                        // 下载在使能触发
    xDone=> ,                                // 下载完成标志
    xBusy=> ,                                // 忙碌或空闲标志
    xError=> ,                               // 错误标志
    sDirNameDest:='/tmp/usb/THDrilling',     // 源路径U盘
    sDirNameSource:='/opt/Dir1/THDrilling', // 目标路径PLC本地存储地址
    xRecursive:=TRUE,
    xOverWrite:=TRUE,
    eError=> );

IF DownLoad.xDone THEN     DownLoad_WanCheng:=TRUE;END_IF
    
IF DownLoad_WanCheng THEN DownLoad_OK_t.IN:=TRUE;DownLoad_OK:=TRUE;Enable:=FALSE;Close:=TRUE;END_IF

DownLoad_OK_t(pt:=T#3S);

IF DownLoad_OK_t.Q THEN DownLoad_OK:=FALSE;DownLoad_OK_t.IN:=FALSE;END_IF

// 关闭USB目录句柄
USBClose(
    xExecute:=Close,
    xDone=> ,
    xBusy=> ,
    xError=> ,
    hDir:=dirfile,
    eError=> );

IF USBClose.xDone THEN Close:=FALSE; Delete_Folder:=TRUE;   END_IF

Delete_r(clk:=Delete_Folder);
//文件删除
Folder_Del(
    Enable:=Delete_r.Q,
    strDir:='/opt/Dir1/THDrilling',
    blBusy=> ,
    blDone=> ,
    blError=> ,
    strFixedDir=>);
    
IF Folder_Del.blDone THEN Delete_Folder_1:=TRUE;END_IF
(*IF blDone THEN Delete_Folder_1:=TRUE; blDone:=FALSE;END_IF*)

Delete_Folder_1_R(in:=Delete_Folder_1,pt:=T#1S);

IF Delete_Folder_1_R.Q THEN
   Delete_Folder:=FALSE;
   DownLoad_WanCheng:=FALSE;    
   init:=FALSE;
   Check:=0;
   Write_i:=0;
   Enable:=FALSE;
   RST_init:=FALSE;
  
END_IF

在次表示感谢
congrikunge
级别: 家园常客
精华主题: 0
发帖数量: 317 个
工控威望: 736 点
下载积分: 702 分
在线时间: 881(小时)
注册时间: 2016-04-22
最后登录: 2026-06-06
查看congrikunge的 主题 / 回贴
1楼  发表于: 8小时前
// ========== 系统定时 ==========
ton_t(in:=NOT ton_t.Q, pt:=T#3S);

// ========== USB检测(仅检测一次,用RS触发器锁定) ==========
CheckUsb(
    xExecute:=ton_t.Q AND NOT CheckUsbDone_RS,  // 只在未成功时检测
    xDone=> ,
    xBusy=> ,
    xError=> ,
    sDirName:='/tmp/usb',
    eError=> ,
    hDir=> );

IF CheckUsb.xDone THEN
    dirfile:=CheckUsb.hDir;
    CheckUsbOk:=TRUE;
    InfoEnable:=TRUE;
    TXT:=1;
    CheckUsbDone_RS:=TRUE;  // 锁定,防止重复检测
END_IF

IF CheckUsb.xError THEN
    CheckUsbOk:=FALSE;
    InfoEnable:=FALSE;
    TXT:=0;
    CheckUsbDone_RS:=FALSE;  // 出错后允许重试
END_IF

// ========== USB信息读取 ==========
USBInfo(
    xExecute:=InfoEnable,
    xDone=> ,
    xBusy=> ,
    xError=> ,
    hDir:=dirfile,
    eError=> ,
    deDirEntry=> );

// ========== 下载触发 ==========
i_t(in:=NOT i_t.Q, pt:=T#1S);
IF i_t.q THEN i:=i+1; END_IF
IF i>10 THEN i:=1; END_IF

DownLoad_r(clk:=DownLoad_Enable);

IF DownLoad_r.Q AND CheckUsbOk THEN
    Enable:=TRUE;
END_IF

// ========== 文件下载 ==========
DownLoad(
    xExecute:=Enable,
    xDone=> ,
    xBusy=> ,
    xError=> ,
    sDirNameDest:='/tmp/usb/THDrilling',
    sDirNameSource:='/opt/Dir1/THDrilling',
    xRecursive:=TRUE,
    xOverWrite:=TRUE,
    eError=> );

IF DownLoad.xDone THEN
    DownLoad_WanCheng:=TRUE;
END_IF

IF DownLoad_WanCheng THEN
    DownLoad_OK_t.IN:=TRUE;
    DownLoad_OK:=TRUE;
    Enable:=FALSE;
    Close:=TRUE;
END_IF

DownLoad_OK_t(pt:=T#3S);
IF DownLoad_OK_t.Q THEN
    DownLoad_OK:=FALSE;
    DownLoad_OK_t.IN:=FALSE;
END_IF

// ========== 关闭USB目录句柄 ==========
USBClose(
    xExecute:=Close,
    xDone=> ,
    xBusy=> ,
    xError=> ,
    hDir:=dirfile,
    eError=> );

IF USBClose.xDone THEN
    Close:=FALSE;
    // 关键:完全释放USB后,重置检测标志,允许下次重新检测
    CheckUsbDone_RS:=FALSE;   // 重置USB检测,下次可重新mount
    CheckUsbOk:=FALSE;        // 清除USB就绪标志
    dirfile:=0;               // 清空句柄
    Delete_Folder:=TRUE;
END_IF

// ========== 删除本地文件 ==========
Delete_r(clk:=Delete_Folder);

Folder_Del(
    Enable:=Delete_r.Q,
    strDir:='/opt/Dir1/THDrilling',
    blBusy=> ,
    blDone=> ,
    blError=> ,
    strFixedDir=>);
    
IF Folder_Del.blDone THEN
    Delete_Folder_1:=TRUE;
END_IF

Delete_Folder_1_R(in:=Delete_Folder_1, pt:=T#1S);

IF Delete_Folder_1_R.Q THEN
    Delete_Folder:=FALSE;
    DownLoad_WanCheng:=FALSE;    
    init:=FALSE;
    Check:=0;
    Write_i:=0;
    Enable:=FALSE;
    RST_init:=FALSE;
END_IF
hqokabc
级别: 略有小成
精华主题: 0
发帖数量: 349 个
工控威望: 369 点
下载积分: 1209 分
在线时间: 23(小时)
注册时间: 2025-01-02
最后登录: 2026-06-06
查看hqokabc的 主题 / 回贴
2楼  发表于: 5小时前
看到语句就头痛