You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用FB_WRITEFILE/FB_READFILE实现CX8190与TwinCAT PC间文件读写?

问题解答

核心结论

FB_WRITEFILE、FB_READFILE这类文件操作功能块无法直接跨设备访问TwinCAT PC上的文件——它们仅支持访问CX8190自身本地存储(内置磁盘/SD卡)的文件,并不具备通过ADS远程操作PC文件系统的能力。

报错原因分析

你传入的sNetId参数是ADS通信标识,但这类文件功能块的sNetId并非用于指定远程文件所在设备。当你传入PC的NetID时,功能块会错误地尝试在CX8190本地设备中查找对应偏移的资源,自然触发ADSERR_DEVICE_INVALIDOFFSET(无效索引偏移)错误。

可行解决方案

方案1:ADS变量交互 + PC端文件操作

通过ADS通信在CX8190和PC之间传递数据,再由PC端程序完成文件读写,这是最常用的跨设备文件交互方式:

  • 在CX8190中将待存储/读取的数据存入ADS全局变量;
  • PC端通过TwinCAT PLC或.NET程序读取/写入这些变量,再执行本地文件操作。

PC端TwinCAT PLC示例代码:

VAR
    fbReadAds: FB_Read;
    fbFileOpen: FB_FileOpen;
    fbWriteFile: FB_WriteFile;
    dataBuffer: ARRAY[0..1023] OF BYTE;
    filePath: STRING := 'C:\TC_Data\cx_data.txt';
    cxNetId: T_AmsNetId := '10.133.96.182.1.1';
    varHandle: DWORD;
    bTransferDone: BOOL;
END_VAR

// 读取CX8190中的数据
fbReadAds(
    sNetId := cxNetId, 
    nPort := 851, 
    nIndexGroup := 16#4020, 
    nIndexOffset := 0, 
    pDestAddr := ADR(dataBuffer), 
    cbLength := SIZEOF(dataBuffer), 
    bExecute := TRUE
);

// 读取完成后写入PC本地文件
IF fbReadAds.bDone THEN
    fbFileOpen(
        sPathName := filePath, 
        nMode := FOPEN_MODEWRITE OR FOPEN_MODECREATE OR FOPEN_MODETEXT, 
        bExecute := TRUE
    );
    IF fbFileOpen.bDone THEN
        fbWriteFile(
            hFile := fbFileOpen.hFile, 
            pSrcAddr := ADR(dataBuffer), 
            cbLength := SIZEOF(dataBuffer), 
            bExecute := TRUE
        );
        IF fbWriteFile.bDone THEN
            bTransferDone := TRUE;
        END_IF;
    END_IF;
END_IF;

方案2:TwinCAT ADS.NET库直接编程

如果需要更灵活的控制,可以用C#/.NET编写PC端程序,通过ADS.NET库直接连接CX8190读写变量,再完成本地文件操作,无需依赖PC端PLC。

方案3:优化FTP自动上传流程

如果暂时不想调整架构,可以在CX8190中使用FB_FtpPutFile/FB_FtpGetFile功能块自动完成文件传输,替代手动操作:

VAR
    fbFtpPut: FB_FtpPutFile;
    pcFtpServer: STRING := '10.133.96.182';
    ftpUser: STRING := 'tc_ftp';
    ftpPass: STRING := 'ftp_pass123';
    cxLocalFile: STRING := '/usr/local_data.txt';
    pcRemoteFile: STRING := '/received_data.txt';
    bTriggerUpload: BOOL := FALSE;
END_VAR

// 触发自动上传
bTriggerUpload := TRUE;
fbFtpPut(
    sServer := pcFtpServer, 
    sUserName := ftpUser, 
    sPassword := ftpPass, 
    sLocalFile := cxLocalFile, 
    sRemoteFile := pcRemoteFile, 
    bExecute := bTriggerUpload
);

IF fbFtpPut.bDone THEN
    bTriggerUpload := FALSE;
    // 上传完成后的逻辑
END_IF;

内容的提问来源于stack exchange,提问作者Mirek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:10:27