能否用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
相关产品推荐
相关产品推荐

