├── .gitignore ├── DataToCsvEx ├── CSV_Writer │ ├── CSV_Writer.plcproj │ ├── CSV_Writer.tmc │ ├── POUs │ │ ├── FB_DataToFileEx.TcPOU │ │ ├── LD_Example.TcPOU │ │ └── MAIN.TcPOU │ └── PlcTask.TcTTO ├── TwinCAT_FileAndCSV_Creating.sln └── TwinCAT_FileWriting.tsproj ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | *.tsproj.bak 11 | *.plcproj.bak 12 | *.~ 13 | *.project.~u 14 | *.tclrs 15 | *.tmcRefac 16 | *.xti.bak 17 | LineIDs.dbg 18 | LineIDs.dbg.bak 19 | _Boot/ 20 | _CompileInfo/ 21 | _Libraries/ 22 | 23 | .engineering_servers/ 24 | liveview_* 25 | *.cache 26 | *.db-shm 27 | *.db-wal 28 | *.pid 29 | .hmiframework/ 30 | .hmipkgs/*-*-*-*/ 31 | tchmipublish.journal.json 32 | packages.config.updates 33 | 34 | # User-specific files (MonoDevelop/Xamarin Studio) 35 | *.userprefs 36 | 37 | # Build results 38 | [Dd]ebug/ 39 | [Dd]ebugPublic/ 40 | [Rr]elease/ 41 | [Rr]eleases/ 42 | x64/ 43 | x86/ 44 | bld/ 45 | [Bb]in/ 46 | [Oo]bj/ 47 | [Ll]og/ 48 | 49 | # Visual Studio 2015 cache/options directory 50 | .vs/ 51 | # Uncomment if you have tasks that create the project's static files in wwwroot 52 | #wwwroot/ 53 | 54 | # MSTest test Results 55 | [Tt]est[Rr]esult*/ 56 | [Bb]uild[Ll]og.* 57 | 58 | # NUNIT 59 | *.VisualState.xml 60 | TestResult.xml 61 | 62 | # Build Results of an ATL Project 63 | [Dd]ebugPS/ 64 | [Rr]eleasePS/ 65 | dlldata.c 66 | 67 | # DNX 68 | project.lock.json 69 | project.fragment.lock.json 70 | artifacts/ 71 | 72 | *_i.c 73 | *_p.c 74 | *_i.h 75 | *.ilk 76 | *.meta 77 | *.obj 78 | *.pch 79 | *.pdb 80 | *.pgc 81 | *.pgd 82 | *.rsp 83 | *.sbr 84 | *.tlb 85 | *.tli 86 | *.tlh 87 | *.tmp 88 | *.tmp_proj 89 | *.log 90 | *.vspscc 91 | *.vssscc 92 | .builds 93 | *.pidb 94 | *.svclog 95 | *.scc 96 | 97 | # Chutzpah Test files 98 | _Chutzpah* 99 | 100 | # Visual C++ cache files 101 | ipch/ 102 | *.aps 103 | *.ncb 104 | *.opendb 105 | *.opensdf 106 | *.sdf 107 | *.cachefile 108 | *.VC.db 109 | *.VC.VC.opendb 110 | 111 | # Visual Studio profiler 112 | *.psess 113 | *.vsp 114 | *.vspx 115 | *.sap 116 | 117 | # TFS 2012 Local Workspace 118 | $tf/ 119 | 120 | # Guidance Automation Toolkit 121 | *.gpState 122 | 123 | # ReSharper is a .NET coding add-in 124 | _ReSharper*/ 125 | *.[Rr]e[Ss]harper 126 | *.DotSettings.user 127 | 128 | # JustCode is a .NET coding add-in 129 | .JustCode 130 | 131 | # TeamCity is a build add-in 132 | _TeamCity* 133 | 134 | # DotCover is a Code Coverage Tool 135 | *.dotCover 136 | 137 | # NCrunch 138 | _NCrunch_* 139 | .*crunch*.local.xml 140 | nCrunchTemp_* 141 | 142 | # MightyMoose 143 | *.mm.* 144 | AutoTest.Net/ 145 | 146 | # Web workbench (sass) 147 | .sass-cache/ 148 | 149 | # Installshield output folder 150 | [Ee]xpress/ 151 | 152 | # DocProject is a documentation generator add-in 153 | DocProject/buildhelp/ 154 | DocProject/Help/*.HxT 155 | DocProject/Help/*.HxC 156 | DocProject/Help/*.hhc 157 | DocProject/Help/*.hhk 158 | DocProject/Help/*.hhp 159 | DocProject/Help/Html2 160 | DocProject/Help/html 161 | 162 | # Click-Once directory 163 | publish/ 164 | 165 | # Publish Web Output 166 | *.[Pp]ublish.xml 167 | *.azurePubxml 168 | # TODO: Comment the next line if you want to checkin your web deploy settings 169 | # but database connection strings (with potential passwords) will be unencrypted 170 | #*.pubxml 171 | *.publishproj 172 | 173 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 174 | # checkin your Azure Web App publish settings, but sensitive information contained 175 | # in these scripts will be unencrypted 176 | PublishScripts/ 177 | 178 | # NuGet Packages 179 | *.nupkg 180 | # The packages folder can be ignored because of Package Restore 181 | **/packages/* 182 | # except build/, which is used as an MSBuild target. 183 | !**/packages/build/ 184 | # Uncomment if necessary however generally it will be regenerated when needed 185 | #!**/packages/repositories.config 186 | # NuGet v3's project.json files produces more ignoreable files 187 | *.nuget.props 188 | *.nuget.targets 189 | 190 | # Microsoft Azure Build Output 191 | csx/ 192 | *.build.csdef 193 | 194 | # Microsoft Azure Emulator 195 | ecf/ 196 | rcf/ 197 | 198 | # Windows Store app package directories and files 199 | AppPackages/ 200 | BundleArtifacts/ 201 | Package.StoreAssociation.xml 202 | _pkginfo.txt 203 | 204 | # Visual Studio cache files 205 | # files ending in .cache can be ignored 206 | *.[Cc]ache 207 | # but keep track of directories ending in .cache 208 | !*.[Cc]ache/ 209 | 210 | # Others 211 | ClientBin/ 212 | ~$* 213 | *~ 214 | *.dbmdl 215 | *.dbproj.schemaview 216 | *.jfm 217 | *.pfx 218 | *.publishsettings 219 | node_modules/ 220 | orleans.codegen.cs 221 | 222 | # Since there are multiple workflows, uncomment next line to ignore bower_components 223 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 224 | #bower_components/ 225 | 226 | # RIA/Silverlight projects 227 | Generated_Code/ 228 | 229 | # Backup & report files from converting an old project file 230 | # to a newer Visual Studio version. Backup files are not needed, 231 | # because we have git ;-) 232 | _UpgradeReport_Files/ 233 | Backup*/ 234 | UpgradeLog*.XML 235 | UpgradeLog*.htm 236 | 237 | # SQL Server files 238 | *.mdf 239 | *.ldf 240 | 241 | # Business Intelligence projects 242 | *.rdl.data 243 | *.bim.layout 244 | *.bim_*.settings 245 | 246 | # Microsoft Fakes 247 | FakesAssemblies/ 248 | 249 | # GhostDoc plugin setting file 250 | *.GhostDoc.xml 251 | 252 | # Node.js Tools for Visual Studio 253 | .ntvs_analysis.dat 254 | 255 | # Visual Studio 6 build log 256 | *.plg 257 | 258 | # Visual Studio 6 workspace options file 259 | *.opt 260 | 261 | # Visual Studio LightSwitch build output 262 | **/*.HTMLClient/GeneratedArtifacts 263 | **/*.DesktopClient/GeneratedArtifacts 264 | **/*.DesktopClient/ModelManifest.xml 265 | **/*.Server/GeneratedArtifacts 266 | **/*.Server/ModelManifest.xml 267 | _Pvt_Extensions 268 | 269 | # Paket dependency manager 270 | .paket/paket.exe 271 | paket-files/ 272 | 273 | # FAKE - F# Make 274 | .fake/ 275 | 276 | # JetBrains Rider 277 | .idea/ 278 | *.sln.iml 279 | 280 | # CodeRush 281 | .cr/ 282 | 283 | # Python Tools for Visual Studio (PTVS) 284 | __pycache__/ 285 | *.pyc 286 | -------------------------------------------------------------------------------- /DataToCsvEx/CSV_Writer/CSV_Writer.plcproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 1.0.0.0 5 | 2.0 6 | {0457bfe1-5b03-4eb1-98d6-5015805a514a} 7 | True 8 | CSV_Writer 9 | 3.1.4020.10 10 | {1cae678c-9ed3-4699-94e2-7d1f55904aac} 11 | {1552415e-6117-4759-be0e-25bf7bd2ea46} 12 | {9a180857-ab45-4c08-82f8-20b8528aa80c} 13 | {e99cc70a-a50d-4ef2-be8a-0e3464ffa22e} 14 | {0a7343b6-7ead-48a7-ae00-d56043e061e3} 15 | {09fa85ad-4fd5-4138-88da-dee29c8df92c} 16 | 17 | 18 | 19 | Code 20 | 21 | 22 | Code 23 | 24 | 25 | Code 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | Tc2_Standard, * (Beckhoff Automation GmbH) 37 | Tc2_Standard 38 | 39 | 40 | Tc2_System, * (Beckhoff Automation GmbH) 41 | Tc2_System 42 | 43 | 44 | Tc2_Utilities, * (Beckhoff Automation GmbH) 45 | Tc2_Utilities 46 | 47 | 48 | Tc3_Module, * (Beckhoff Automation GmbH) 49 | Tc3_Module 50 | 51 | 52 | 53 | 54 | Content 55 | 56 | 57 | 58 | 59 | Tc2_Standard, * (Beckhoff Automation GmbH) 60 | 61 | 62 | Tc2_System, * (Beckhoff Automation GmbH) 63 | 64 | 65 | Tc2_Utilities, * (Beckhoff Automation GmbH) 66 | 67 | 68 | Tc3_Module, * (Beckhoff Automation GmbH) 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | "<ProjectRoot>" 77 | 78 | {FE9F63D4-9E34-43ce-9322-D46747A00F33} 79 | 80 | "{FE9F63D4-9E34-43ce-9322-D46747A00F33}" 81 | 82 | 83 | 84 | {8F99A816-E488-41E4-9FA3-846536012284} 85 | 86 | "{8F99A816-E488-41E4-9FA3-846536012284}" 87 | 88 | 89 | 90 | {29BD8D0C-3586-4548-BB48-497B9A01693F} 91 | 92 | "{29BD8D0C-3586-4548-BB48-497B9A01693F}" 93 | 94 | Rules 95 | 96 | "Rules" 97 | 98 | 167 99 | 100 | "167" 101 | 102 | 103 | bActive 104 | True 105 | 106 | 107 | 4 108 | 109 | "4" 110 | 111 | 112 | bActive 113 | True 114 | 115 | 116 | 33 117 | 118 | "33" 119 | 120 | 121 | bActive 122 | True 123 | 124 | 125 | 6 126 | 127 | "6" 128 | 129 | 130 | bActive 131 | True 132 | 133 | 134 | 27 135 | 136 | "27" 137 | 138 | 139 | bActive 140 | True 141 | 142 | 143 | 28 144 | 145 | "28" 146 | 147 | 148 | bActive 149 | True 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | {40450F57-0AA3-4216-96F3-5444ECB29763} 159 | 160 | "{40450F57-0AA3-4216-96F3-5444ECB29763}" 161 | 162 | 163 | ActiveVisuProfile 164 | IR0whWr8bwfwBwAAiD2qpQAAAABVAgAA37x72QAAAAABAAAAAAAAAAEaUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwACTHsAZgA5ADUAYgBiADQAMgA2AC0ANQA1ADIANAAtADQAYgA0ADUALQA5ADQAMAAwAC0AZgBiADAAZgAyAGUANwA3AGUANQAxAGIAfQADCE4AYQBtAGUABDBUAHcAaQBuAEMAQQBUACAAMwAuADEAIABCAHUAaQBsAGQAIAA0ADAAMgA0AC4ANwAFFlAAcgBvAGYAaQBsAGUARABhAHQAYQAGTHsAMQA2AGUANQA1AGIANgAwAC0ANwAwADQAMwAtADQAYQA2ADMALQBiADYANQBiAC0ANgAxADQANwAxADMAOAA3ADgAZAA0ADIAfQAHEkwAaQBiAHIAYQByAGkAZQBzAAhMewAzAGIAZgBkADUANAA1ADkALQBiADAANwBmAC0ANABkADYAZQAtAGEAZQAxAGEALQBhADgAMwAzADUANgBhADUANQAxADQAMgB9AAlMewA5AGMAOQA1ADgAOQA2ADgALQAyAGMAOAA1AC0ANAAxAGIAYgAtADgAOAA3ADEALQA4ADkANQBmAGYAMQBmAGUAZABlADEAYQB9AAoOVgBlAHIAcwBpAG8AbgALBmkAbgB0AAwKVQBzAGEAZwBlAA0KVABpAHQAbABlAA4aVgBpAHMAdQBFAGwAZQBtAE0AZQB0AGUAcgAPDkMAbwBtAHAAYQBuAHkAEAxTAHkAcwB0AGUAbQARElYAaQBzAHUARQBsAGUAbQBzABIwVgBpAHMAdQBFAGwAZQBtAHMAUwBwAGUAYwBpAGEAbABDAG8AbgB0AHIAbwBsAHMAEyhWAGkAcwB1AEUAbABlAG0AcwBXAGkAbgBDAG8AbgB0AHIAbwBsAHMAFCRWAGkAcwB1AEUAbABlAG0AVABlAHgAdABFAGQAaQB0AG8AcgAVIlYAaQBzAHUATgBhAHQAaQB2AGUAQwBvAG4AdAByAG8AbAAWFHYAaQBzAHUAaQBuAHAAdQB0AHMAFwxzAHkAcwB0AGUAbQAYGFYAaQBzAHUARQBsAGUAbQBCAGEAcwBlABkmRABlAHYAUABsAGEAYwBlAGgAbwBsAGQAZQByAHMAVQBzAGUAZAAaCGIAbwBvAGwAGyJQAGwAdQBnAGkAbgBDAG8AbgBzAHQAcgBhAGkAbgB0AHMAHEx7ADQAMwBkADUAMgBiAGMAZQAtADkANAAyAGMALQA0ADQAZAA3AC0AOQBlADkANAAtADEAYgBmAGQAZgAzADEAMABlADYAMwBjAH0AHRxBAHQATABlAGEAcwB0AFYAZQByAHMAaQBvAG4AHhRQAGwAdQBnAGkAbgBHAHUAaQBkAB8WUwB5AHMAdABlAG0ALgBHAHUAaQBkACBIYQBmAGMAZAA1ADQANAA2AC0ANAA5ADEANAAtADQAZgBlADcALQBiAGIANwA4AC0AOQBiAGYAZgBlAGIANwAwAGYAZAAxADcAIRRVAHAAZABhAHQAZQBJAG4AZgBvACJMewBiADAAMwAzADYANgBhADgALQBiADUAYwAwAC0ANABiADkAYQAtAGEAMAAwAGUALQBlAGIAOAA2ADAAMQAxADEAMAA0AGMAMwB9ACMOVQBwAGQAYQB0AGUAcwAkTHsAMQA4ADYAOABmAGYAYwA5AC0AZQA0AGYAYwAtADQANQAzADIALQBhAGMAMAA2AC0AMQBlADMAOQBiAGIANQA1ADcAYgA2ADkAfQAlTHsAYQA1AGIAZAA0ADgAYwAzAC0AMABkADEANwAtADQAMQBiADUALQBiADEANgA0AC0ANQBmAGMANgBhAGQAMgBiADkANgBiADcAfQAmFk8AYgBqAGUAYwB0AHMAVAB5AHAAZQAnVFUAcABkAGEAdABlAEwAYQBuAGcAdQBhAGcAZQBNAG8AZABlAGwARgBvAHIAQwBvAG4AdgBlAHIAdABpAGIAbABlAEwAaQBiAHIAYQByAGkAZQBzACgQTABpAGIAVABpAHQAbABlACkUTABpAGIAQwBvAG0AcABhAG4AeQAqHlUAcABkAGEAdABlAFAAcgBvAHYAaQBkAGUAcgBzACs4UwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAsEnYAaQBzAHUAZQBsAGUAbQBzAC1INgBjAGIAMQBjAGQAZQAxAC0AZAA1AGQAYwAtADQAYQAzAGIALQA5ADAANQA0AC0AMgAxAGYAYQA3ADUANgBhADMAZgBhADQALihJAG4AdABlAHIAZgBhAGMAZQBWAGUAcgBzAGkAbwBuAEkAbgBmAG8AL0x7AGMANgAxADEAZQA0ADAAMAAtADcAZgBiADkALQA0AGMAMwA1AC0AYgA5AGEAYwAtADQAZQAzADEANABiADUAOQA5ADYANAAzAH0AMBhNAGEAagBvAHIAVgBlAHIAcwBpAG8AbgAxGE0AaQBuAG8AcgBWAGUAcgBzAGkAbwBuADIMTABlAGcAYQBjAHkAMzBMAGEAbgBnAHUAYQBnAGUATQBvAGQAZQBsAFYAZQByAHMAaQBvAG4ASQBuAGYAbwA0MEwAbwBhAGQATABpAGIAcgBhAHIAaQBlAHMASQBuAHQAbwBQAHIAbwBqAGUAYwB0ADUaQwBvAG0AcABhAHQAaQBiAGkAbABpAHQAeQDQAAIaA9ADAS0E0AUGGgfQBwgaAUUHCQjQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtDtAPAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAKAAAANAMC60BAAAA0A0BLRHQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0S0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAUAAAA0AwLrQIAAADQDQEtE9APAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAAAAAANAMC60CAAAA0A0BLRTQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0V0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtFtAPAS0X0AAJGgRFCgsEAwAAAAUAAAANAAAAKAAAANAMC60EAAAA0A0BLRjQDwEtENAZGq0BRRscAdAAHBoCRR0LBAMAAAAFAAAADQAAAAAAAADQHh8tINAhIhoCRSMkAtAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAAAAANADAS0n0CgBLRHQKQEtENAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAQAAANADAS0n0CgBLRHQKQEtEJoqKwFFAAEC0AABLSzQAAEtF9AAHy0t0C4vGgPQMAutAQAAANAxC60XAAAA0DIarQDQMy8aA9AwC60CAAAA0DELrQMAAADQMhqtANA0Gq0A0DUarQA= 165 | 166 | 167 | {A3BBA713-63D7-4de6-BEC2-E3BAAD8789F8} 168 | 169 | "{A3BBA713-63D7-4de6-BEC2-E3BAAD8789F8}" 170 | 171 | 172 | 173 | {C70B7845-2722-4a9b-A0EA-88C877A4B36F} 174 | 175 | "{C70B7845-2722-4a9b-A0EA-88C877A4B36F}" 176 | 177 | 178 | EnableMaxAuthenticationTrials 179 | true 180 | MaxAuthenticationTrials 181 | 3 182 | UserList 183 | 184 | 185 | 186 | {891d7bb5-cdf2-4b43-81c4-047dbc0d5105} 187 | "Owner" 188 | "" 189 | "" 190 | true 191 | 192 | 193 | 194 | MaxTimeOfInactivity 195 | 10 196 | EnableMaxTimeOfInactivity 197 | true 198 | GroupList 199 | 200 | 201 | 202 | {abf8cb18-7f58-4d75-a23f-ec5880939b61} 203 | "Everyone" 204 | "" 205 | true 206 | false 207 | 208 | 891d7bb5-cdf2-4b43-81c4-047dbc0d5105 209 | 210 | 211 | 212 | 213 | {dff25aef-5561-4406-88bb-be9dd91dfbc4} 214 | "Owner" 215 | "" 216 | false 217 | true 218 | 219 | 891d7bb5-cdf2-4b43-81c4-047dbc0d5105 220 | 221 | 222 | 223 | 224 | 225 | UserAuthentication 226 | 227 | 228 | 891d7bb5-cdf2-4b43-81c4-047dbc0d5105 229 | d41d8cd98f00b204e9800998ecf8427e 230 | 231 | 232 | 233 | 234 | {192FAD59-8248-4824-A8DE-9177C94C195A} 235 | 236 | "{192FAD59-8248-4824-A8DE-9177C94C195A}" 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | System.Collections.ArrayList 246 | System.Boolean 247 | {daecd4be-1e2b-4335-a125-4a1ac83ea49f} 248 | {bf4dffda-f055-446d-9d7a-5f126720896b} 249 | System.Guid 250 | System.Collections.Hashtable 251 | System.Int32 252 | {54dd0eac-a6d8-46f2-8c27-2f43c7e49861} 253 | System.String 254 | {cd83029e-13b0-491e-9e4b-921adda0d86b} 255 | {3635a671-97f5-41bb-9e29-0ebb9795975c} 256 | {9fe6b547-6bc8-4f11-b589-b517860c5891} 257 | 258 | 259 | 260 | 261 | -------------------------------------------------------------------------------- /DataToCsvEx/CSV_Writer/POUs/FB_DataToFileEx.TcPOU: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 59 | 60 | udiWriteBufferWritePos) THEN 72 | _sFileRoot:=sFileRoot; 73 | IF _sFileRoot[Len(_sFileRoot)-1] <> 92 THEN 74 | _sFileRoot:=CONCAT(_sFileRoot,'\'); 75 | END_IF 76 | xBusy := TRUE; 77 | udiErrId:=0; 78 | IF sHeader = '' THEN 79 | iStep := 10; 80 | ELSE 81 | iStep:=2; 82 | END_IF 83 | END_IF 84 | 85 | 2: (*Check if file Exist, this state lets us know if the header needs to be added*) 86 | FB_FileExistCheck(xExecute:=FALSE , sPathName:=CONCAT(_sFileRoot, sFileName), xAbort:=FALSE ); 87 | FB_FileExistCheck(xExecute:=TRUE , sPathName:=CONCAT(_sFileRoot, sFileName), xAbort:=FALSE ); 88 | iStep:=4; 89 | 90 | 4: 91 | FB_FileExistCheck(xExecute:=FALSE , sPathName:=CONCAT(_sFileRoot, sFileName), xAbort:=FALSE ); 92 | IF NOT xBusyFileExistCheck THEN 93 | IF NOT xErrorFileExistCheck THEN 94 | IF xFileExist THEN 95 | xFileHeaderNeeded:=FALSE; 96 | ELSE 97 | xFileHeaderNeeded:=TRUE; 98 | END_IF 99 | iStep:=10; 100 | ELSE 101 | udiErrId :=udiInternalErrorIDFileExistCheck; 102 | xError := TRUE; 103 | iStep:=1000; 104 | END_IF 105 | END_IF 106 | 107 | 10: (* open source file *) 108 | fbFileOpen( bExecute := FALSE ); 109 | fbFileOpen( sPathName := CONCAT(_sFileRoot, sFileName), 110 | nMode := FOPEN_MODEAPPEND OR FOPEN_MODETEXT, (*FOPEN_MODETEXT or FOPEN_MODEREAD or FOPEN_MODEWRITE *) 111 | ePath := PATH_GENERIC, 112 | tTimeout := T#1000ms, 113 | bExecute := TRUE ); 114 | iStep := iStep + 10; 115 | 116 | 117 | 20: 118 | fbFileOpen( bExecute := FALSE ); 119 | IF ( NOT fbFileOpen.bBusy ) THEN 120 | IF ( fbFileOpen.bError ) THEN 121 | IF fbFileOpen.nErrId = 1804 THEN //This occurs when the folder does not exist. 122 | iStep:=300; 123 | ELSE 124 | udiErrId :=fbFileOpen.nErrId; 125 | xError := TRUE; 126 | iStep:=1000; 127 | END_IF 128 | ELSE 129 | hSrcFile := fbFileOpen.hFile; 130 | IF NOT xFileHeaderNeeded THEN 131 | iStep := iStep + 10; 132 | ELSE 133 | iStep:=iStep+2; 134 | END_IF 135 | END_IF 136 | END_IF 137 | 138 | 22: (*Header needed*) 139 | fbFileWrite(bExecute := FALSE); 140 | fbFileWrite(pWriteBuff:=ADR(sHeader), 141 | cbWriteLen:=DINT_TO_UDINT(LEN(sHeader)), 142 | hFile:=hSrcFile, 143 | tTimeout := T#1000ms, 144 | bExecute := TRUE ); 145 | iStep:=iStep+2; 146 | 147 | 24: 148 | fbFileWrite(bExecute := FALSE); 149 | IF ( NOT fbFileWrite.bBusy ) THEN 150 | IF ( fbFileWrite.bError ) THEN 151 | udiErrId :=fbFileWrite.nErrId; 152 | xError := TRUE; 153 | iStep:=1000; 154 | ELSE 155 | iStep := iStep+6; 156 | END_IF 157 | END_IF 158 | 159 | 30: (* Write to Source File *) 160 | IF udiWriteBufferAddPos > udiWriteBufferWritePos THEN 161 | udiWriteBufferWriteLength:=udiWriteBufferAddPos - udiWriteBufferWritePos; 162 | 163 | fbFileWrite( bExecute := FALSE ); 164 | fbFileWrite( pWriteBuff:=ADR(barrWriteBuffer[udiWriteBufferWritePos]), 165 | cbWriteLen:=udiWriteBufferWriteLength, 166 | hFile:=hSrcFile, 167 | tTimeout := T#1000ms, 168 | bExecute := TRUE ); 169 | 170 | udiWriteBufferWritePos:=udiWriteBufferAddPos; 171 | 172 | ELSE 173 | udiWriteBufferWriteLength:=udiBufferSize - udiWriteBufferWritePos+1; 174 | 175 | fbFileWrite( bExecute := FALSE ); 176 | fbFileWrite( pWriteBuff:=ADR(barrWriteBuffer[udiWriteBufferWritePos]), 177 | cbWriteLen:=udiWriteBufferWriteLength, 178 | hFile:=hSrcFile, 179 | tTimeout := T#1000ms, 180 | bExecute := TRUE ); 181 | 182 | udiWriteBufferWritePos:=1; 183 | END_IF 184 | iStep:=iStep+10; 185 | 186 | 40: 187 | fbFileWrite(bExecute := FALSE); 188 | IF ( NOT fbFileWrite.bBusy ) THEN 189 | IF ( fbFileWrite.bError ) THEN 190 | udiErrId :=fbFileWrite.nErrId; 191 | xError := TRUE; 192 | iStep:=1000; 193 | ELSE 194 | IF udiWriteBufferAddPos = udiWriteBufferWritePos THEN 195 | iStep := iStep+10; 196 | ELSE 197 | iStep:=iStep-10; 198 | END_IF 199 | END_IF 200 | END_IF 201 | 202 | 50: (*Get File data Size information*) 203 | fbFileTell( bExecute := FALSE ); 204 | fbFileTell( hFile:=hSrcFile, 205 | tTimeout := T#1000ms, 206 | bExecute := TRUE ); 207 | iStep:=iStep+10; 208 | 209 | 210 | 60: 211 | fbFileTell(bExecute := FALSE); 212 | IF ( NOT fbFileTell.bBusy ) THEN 213 | IF NOT fbFileTell.bError THEN 214 | iStep := iStep+10; 215 | ELSE 216 | udiErrId :=fbFileTell.nErrId; 217 | xError := TRUE; 218 | iStep:=1000; 219 | END_IF 220 | END_IF 221 | 222 | 223 | 70: (* close source file *) 224 | fbFileClose( bExecute := FALSE ); 225 | fbFileClose( hFile:=hSrcFile, 226 | bExecute:=TRUE, 227 | tTimeout:=T#1000ms ); 228 | iStep := iStep + 10; 229 | 230 | 231 | 80: 232 | fbFileClose(bExecute := FALSE); 233 | IF ( NOT fbFileClose.bBusy ) THEN 234 | IF ( fbFileClose.bError ) THEN 235 | udiErrId :=fbFileTell.nErrId; 236 | xError := TRUE; 237 | iStep:=1000; 238 | hSrcFile:=0; 239 | ELSE 240 | hSrcFile := 0; 241 | IF fbFileTell.nSeekPos > 990000 THEN (*If file is approaching 1 MB then lets start with a new log file*) 242 | iStep:=200; 243 | ELSE 244 | iStep := iStep+10; 245 | END_IF; 246 | END_IF; 247 | END_IF 248 | 249 | 90: (*Finished, reset*) 250 | xError:=FALSE; 251 | xBusy:=FALSE; 252 | iStep:=0; 253 | 254 | 200: (* Delete the last file*) 255 | fbFileDelete( bExecute := FALSE ); 256 | fbFileDelete( sPathName :=CONCAT(_sFileRoot,sFileNameHistory), 257 | ePath := PATH_GENERIC, 258 | tTimeout := T#1000ms, 259 | bExecute := TRUE ); 260 | iStep := iStep + 10; 261 | 262 | 263 | 210: 264 | fbFileDelete( bExecute := FALSE ); 265 | IF ( NOT fbFileDelete.bBusy ) THEN 266 | (*IF ( fbFileDelete.bError ) THEN (*ignore errors since this is expected*) 267 | udiErrId := fbFileOpen.nErrId; 268 | Step := 50; 269 | ELSE*) 270 | iStep := iStep + 10; 271 | (*END_IF*) 272 | END_IF; 273 | 274 | 220: (* rename files so that the new data has a lower file number and older data has a larger file number*) 275 | fbRenameFile( bExecute := FALSE ); 276 | fbRenameFile( sOldName:=CONCAT(_sFileRoot,sFileName), 277 | sNewName:=CONCAT(_sFileRoot,sFileNameHistory), 278 | ePath := PATH_GENERIC, 279 | tTimeout := T#1000ms, 280 | bExecute := TRUE ); 281 | iStep := iStep + 10; 282 | 283 | 230: 284 | fbRenameFile( bExecute := FALSE ); 285 | IF ( NOT fbRenameFile.bBusy ) THEN 286 | (*IF ( fbRenameFile.bError ) THEN (*ignore errors since this is expected*) 287 | udiErrId := fbRenameFile.nErrId; 288 | Step := 50; 289 | ELSE*) 290 | 291 | iStep := 90; 292 | 293 | (*END_IF*) 294 | END_IF; 295 | 296 | 297 | 300: (*create directory *) 298 | FB_CreateDirEx(sFileRoot:=_sFileRoot, xExecute := FALSE ); 299 | FB_CreateDirEx( sFileRoot:=_sFileRoot, xExecute:=TRUE ); 300 | iStep := iStep + 10; 301 | 302 | 303 | 310: 304 | FB_CreateDirEx(sFileRoot:=_sFileRoot,xExecute := FALSE); 305 | IF NOT xBusyCreateDirEx THEN 306 | IF NOT xErrorCreateDirEx THEN 307 | iStep := 10; 308 | ELSE 309 | udiErrId := udiErrorIdCreateDirEx; 310 | iStep:=1000; 311 | xError := TRUE; 312 | hSrcFile := 0; 313 | END_IF; 314 | END_IF 315 | 316 | 1000: (*error *) 317 | IF (hSrcFile <> 0 ) THEN 318 | iStep := 70; (* close the source file *) 319 | ELSE 320 | TonRetryTimer(IN:=TRUE, PT:=T#5S); 321 | IF TonRetryTimer.Q THEN 322 | TonRetryTimer(IN:=FALSE); 323 | iStep := 0; (* ready *) 324 | xBusy := FALSE; 325 | END_IF 326 | END_IF 327 | 328 | 1001:(*Log shutdown*) 329 | TonRetryTimer(IN:=TRUE, PT:=T#2h); 330 | IF TonRetryTimer.Q THEN 331 | TonRetryTimer(IN:=FALSE); 332 | iStep := 0; (* ready *) 333 | xBusy := FALSE; 334 | iErrorCounter:=0; 335 | END_IF 336 | 337 | END_CASE]]> 338 | 339 | 340 | 358 | 359 | 0; 443 | ]]> 444 | 445 | 446 | 447 | 458 | 459 | 509 | 510 | 511 | 512 | 526 | 527 | 0 THEN 537 | IF sPathSearchName[Len(sPathName)-1] = 92 THEN 538 | sPathSearchName[Len(sPathName)-1] := 0; 539 | END_IF 540 | 541 | //Get the Child Name 542 | FOR x:= INT_TO_UINT(LEN(sPathSearchName)-1) TO 0 BY -1 DO 543 | IF sPathSearchName[x] = 92 THEN 544 | IF INT_TO_UINT(LEN(sPathSearchName)) > x THEN 545 | MEMCPY(ADR(sChildDirectory),ADR(sPathSearchName)+x+1,DINT_TO_UDINT(LEN(sPathSearchName))-x); 546 | END_IF 547 | EXIT; 548 | END_IF 549 | END_FOR 550 | END_IF 551 | xErrorFolderExistCheck:=FALSE; 552 | END_IF 553 | 554 | 1: (* enum one entry *) 555 | IF xAbort THEN 556 | fbEnum.eCmd := eEnumCmd_Abort; 557 | END_IF 558 | fbEnum( bExecute := FALSE ); 559 | fbEnum( bExecute := TRUE, sPathName := sPathSearchName); 560 | iState := 2; 561 | 562 | 2: (* wait until function block not busy *) 563 | fbEnum( bExecute := FALSE ); 564 | IF NOT fbEnum.bBusy THEN 565 | IF NOT fbEnum.bError THEN 566 | IF NOT fbEnum.bEOE THEN 567 | (*Check for directory or file*) 568 | IF fbEnum.stFindFile.fileAttributes.bDirectory THEN 569 | IF sChildDirectory = fbEnum.stFindFile.sFileName THEN 570 | xFolderExist:=TRUE; 571 | //Found file 572 | iState:=0; 573 | ELSE 574 | iState:=1; 575 | fbEnum.eCmd := eEnumCmd_Next; (* enum next entry *) 576 | END_IF 577 | 578 | ELSE 579 | iState:=1; 580 | fbEnum.eCmd := eEnumCmd_Next; (* enum next entry *) 581 | 582 | END_IF 583 | 584 | ELSE (* no more entries *) 585 | iState := 0; 586 | END_IF 587 | ELSE (* log error *) 588 | xErrorFolderExistCheck:=TRUE; 589 | udiInternalErrorIDFolderExistCheck:=fbEnum.nErrID; 590 | iState := 0; 591 | END_IF 592 | END_IF 593 | END_CASE 594 | IF iState = 0 THEN 595 | xBusyFolderExistCheck:=FALSE; 596 | ELSE 597 | xBusyFolderExistCheck:=TRUE; 598 | END_IF]]> 599 | 600 | 601 | 602 | 608 | 609 | 617 | 618 | 619 | 620 | 629 | 630 | udiBufferSize THEN 635 | udiWriteBufferAddPos:=1; 636 | END_IF 637 | 638 | ELSE 639 | udiLength:=udiBufferSize -udiWriteBufferAddPos + 1; 640 | MEMCPY( ADR(barrWriteBuffer[udiWriteBufferAddPos]), ADR(sColumn), udiLength); 641 | 642 | 643 | MEMCPY( ADR(barrWriteBuffer[1]), ADR(sColumn)+udiLength ,DINT_TO_UDINT(LEN(sColumn))-udiLength); 644 | udiWriteBufferAddPos:=udiWriteBufferAddPos + DINT_TO_UDINT(LEN(sColumn)) -udiBufferSize ; 645 | 646 | END_IF]]> 647 | 648 | 649 | 650 | 657 | 658 | 662 | 663 | 664 | 665 | 673 | 674 | 680 | 681 | 682 | 683 | 692 | 693 | 701 | 702 | 703 | 704 | 714 | 715 | 725 | 726 | 727 | 728 | 739 | 740 | 752 | 753 | 754 | 755 | 767 | 768 | 782 | 783 | 784 | 785 | 792 | 793 | 0 THEN 796 | IF udiDataLength + udiWriteBufferAddPos - 1 <= udiBufferSize THEN 797 | MEMCPY( ADR(barrWriteBuffer[udiWriteBufferAddPos]), pData,udiDataLength); 798 | udiWriteBufferAddPos:=udiWriteBufferAddPos +udiDataLength; 799 | IF udiWriteBufferAddPos > udiBufferSize THEN 800 | udiWriteBufferAddPos:=1; 801 | END_IF 802 | 803 | ELSE 804 | (*Note how to calcuate initial write length -> udiLength:=udiBufferSize -udiWriteBufferAddPos + 1;*) 805 | MEMCPY( ADR(barrWriteBuffer[udiWriteBufferAddPos]), pData, (udiBufferSize -udiWriteBufferAddPos + 1)); 806 | 807 | MEMCPY( ADR(barrWriteBuffer[1]), pData+(udiBufferSize -udiWriteBufferAddPos + 1) ,udiDataLength - (udiBufferSize -udiWriteBufferAddPos + 1)); 808 | udiWriteBufferAddPos:=udiWriteBufferAddPos + udiDataLength -udiBufferSize ; 809 | 810 | END_IF 811 | END_IF]]> 812 | 813 | 814 | 815 | 821 | 822 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | -------------------------------------------------------------------------------- /DataToCsvEx/CSV_Writer/POUs/LD_Example.TcPOU: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 8 | 9 | 10 | 11 | 12 | 13 | "" 14 | "Ld" 15 | 16 | 17 | false 18 | false 19 | false 20 | 21 | "" 22 | "" 23 | "" 24 | false 25 | 26 | 27 | "FB_DataToFileEx" 28 | 29 | "FB_DataToFileEx" 30 | "FB_DATATOFILEEX" 31 | "" 32 | "" 33 | "" 34 | 35 | 0 36 | false 37 | false 38 | 39 | false 40 | false 41 | true 42 | 6L 43 | 44 | 45 | 46 | 47 | 48 | "" 49 | "BOOL" 50 | "" 51 | "" 52 | "" 53 | 54 | 0 55 | false 56 | false 57 | 58 | true 59 | false 60 | false 61 | 8L 62 | 63 | 64 | "" 65 | "BOOL" 66 | "" 67 | "" 68 | "" 69 | 70 | 0 71 | false 72 | false 73 | 74 | true 75 | false 76 | false 77 | 9L 78 | 79 | 80 | 81 | 82 | 0 83 | false 84 | false 85 | 86 | 87 | 88 | 89 | 90 | "'C:\'" 91 | "STRING(INT#3)" 92 | "" 93 | "" 94 | "" 95 | 96 | 0 97 | false 98 | false 99 | 100 | false 101 | false 102 | false 103 | 11L 104 | 105 | 10L 106 | 107 | 108 | 109 | "'MyDataFile.CSV'" 110 | "STRING(INT#14)" 111 | "" 112 | "" 113 | "" 114 | 115 | 0 116 | false 117 | false 118 | 119 | false 120 | false 121 | false 122 | 13L 123 | 124 | 12L 125 | 126 | 127 | 128 | "'Column1,Column2,Column3'" 129 | "STRING(INT#23)" 130 | "" 131 | "" 132 | "" 133 | 134 | 0 135 | false 136 | false 137 | 138 | false 139 | false 140 | false 141 | 15L 142 | 143 | 14L 144 | 145 | 146 | 147 | "" 148 | "STRING" 149 | "" 150 | "" 151 | "" 152 | 153 | 0 154 | false 155 | false 156 | 157 | false 158 | false 159 | false 160 | 17L 161 | 162 | 16L 163 | 164 | 165 | 166 | 167 | sFileRoot 168 | sFileName 169 | sHeader 170 | sFileNameHistory 171 | 172 | 173 | STRING 174 | STRING 175 | T_MaxString 176 | STRING 177 | 178 | 179 | 180 | 181 | udiErrId 182 | xBusy 183 | xError 184 | 185 | 186 | UDINT 187 | BOOL 188 | BOOL 189 | 190 | 191 | FunctionBlock 192 | false 193 | false 194 | 195 | false 196 | false 197 | 7L 198 | 199 | 200 | 201 | 5L 202 | 203 | 204 | false 205 | false 206 | false 207 | 208 | "" 209 | "" 210 | "" 211 | false 212 | 213 | 214 | "FB_DataToFileEx.M_LogAsCsv_3column" 215 | 216 | "FB_DataToFileEx" 217 | "FB_DATATOFILEEX" 218 | "" 219 | "" 220 | "" 221 | 222 | 0 223 | false 224 | false 225 | 226 | false 227 | false 228 | true 229 | 69L 230 | 231 | 232 | 233 | 234 | 235 | "" 236 | "BOOL" 237 | "" 238 | "" 239 | "" 240 | 241 | 0 242 | false 243 | false 244 | 245 | true 246 | false 247 | false 248 | 56L 249 | 250 | 251 | 252 | 253 | 0 254 | true 255 | false 256 | 257 | 258 | 259 | 260 | 261 | "SaveData" 262 | "BOOL" 263 | "" 264 | "" 265 | "" 266 | 267 | 16 268 | true 269 | false 270 | 271 | false 272 | true 273 | false 274 | 53L 275 | 276 | 52L 277 | 278 | 279 | 280 | "'Data1'" 281 | "STRING(INT#5)" 282 | "" 283 | "" 284 | "" 285 | 286 | 0 287 | false 288 | false 289 | 290 | false 291 | false 292 | false 293 | 58L 294 | 295 | 57L 296 | 297 | 298 | 299 | "'Data2'" 300 | "STRING(INT#5)" 301 | "" 302 | "" 303 | "" 304 | 305 | 0 306 | false 307 | false 308 | 309 | false 310 | false 311 | false 312 | 60L 313 | 314 | 59L 315 | 316 | 317 | 318 | "'Data3'" 319 | "STRING(INT#5)" 320 | "" 321 | "" 322 | "" 323 | 324 | 0 325 | false 326 | false 327 | 328 | false 329 | false 330 | false 331 | 66L 332 | 333 | 65L 334 | 335 | 336 | 337 | 338 | EN 339 | sColumn1 340 | sColumn2 341 | sColumn3 342 | 343 | 344 | BOOL 345 | STRING 346 | STRING 347 | STRING 348 | 349 | 350 | 351 | 352 | ENO 353 | M_LogAsCsv_3column 354 | 355 | 356 | BOOL 357 | BOOL 358 | 359 | 360 | Method 361 | true 362 | true 363 | 364 | false 365 | false 366 | 70L 367 | 368 | 369 | 370 | 51L 371 | 372 | 373 | 0 374 | true 375 | 376 | 377 | 378 | System.Boolean 379 | {acfc6f68-8e3a-4af5-bf81-3dd512095a46} 380 | {9de7f100-1b87-424c-a62e-45b0cfc85ed2} 381 | {668066f2-6069-46b3-8962-8db8d13d7db2} 382 | System.Int32 383 | System.Int64 384 | {d9a99d73-b633-47db-b876-a752acb25871} 385 | {25e509de-33d4-4447-93f8-c9e4ea381c8b} 386 | {c9b2f165-48a2-4a45-8326-3952d8a3d708} 387 | {bffb3c53-f105-4e85-aba2-e30df579d75f} 388 | {f40d3e09-c02c-4522-a88c-dac23558cfc4} 389 | {71496971-9e0c-4677-a832-b9583b571130} 390 | System.String 391 | 392 | 393 | 394 | 395 | 396 | -------------------------------------------------------------------------------- /DataToCsvEx/CSV_Writer/POUs/MAIN.TcPOU: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 13 | 14 | , 21 | xBusy=> , 22 | xError=> ); 23 | 24 | //Use Methods to write to file. Method places data into buffer. FB_DataToFile cyclic call saves data to file. 25 | 26 | //TEST or TRY ///// xStartRecording OR xRecordOnce to see it work! 27 | IF xStartRecording OR xRecordOnce THEN 28 | xRecordOnce:=FALSE; 29 | Counter:=Counter+1; 30 | FB_DataToFile.M_LogAsCsv_2column('Hello World', DINT_TO_STRING(Counter)); 31 | END_IF 32 | 33 | //Optional. For creating any type of file other then CSV. 34 | //FB_DataToFile.M_LogString(CONCAT(CONCAT('Hello World ', DINT_TO_STRING(Counter)),'$L')); //$L is a line feed 35 | 36 | ]]> 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /DataToCsvEx/CSV_Writer/PlcTask.TcTTO: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 1000 6 | 20 7 | 8 | MAIN 9 | 10 | {bb58b415-2e0e-49a6-8d78-d50ac6faf491} 11 | {5bbbb476-7ed5-44c7-8069-359f238d0353} 12 | {a4f2f103-45aa-402d-b7bd-ab7ea733ef7d} 13 | {c09d378a-ff69-4bce-845f-8b3e2fd6a046} 14 | {c4a7d011-f57b-4cdd-b2d8-1d3dd16e9302} 15 | 16 | -------------------------------------------------------------------------------- /DataToCsvEx/TwinCAT_FileAndCSV_Creating.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # TcXaeShell Solution File, Format Version 11.00 4 | VisualStudioVersion = 15.0.28010.2050 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{B1E792BE-AA5F-4E3C-8C82-674BF9C0715B}") = "TwinCAT_FileWriting", "TwinCAT_FileWriting.tsproj", "{5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|TwinCAT CE7 (ARMV7) = Debug|TwinCAT CE7 (ARMV7) 11 | Debug|TwinCAT OS (ARMT2) = Debug|TwinCAT OS (ARMT2) 12 | Debug|TwinCAT RT (x64) = Debug|TwinCAT RT (x64) 13 | Debug|TwinCAT RT (x86) = Debug|TwinCAT RT (x86) 14 | Release|TwinCAT CE7 (ARMV7) = Release|TwinCAT CE7 (ARMV7) 15 | Release|TwinCAT OS (ARMT2) = Release|TwinCAT OS (ARMT2) 16 | Release|TwinCAT RT (x64) = Release|TwinCAT RT (x64) 17 | Release|TwinCAT RT (x86) = Release|TwinCAT RT (x86) 18 | EndGlobalSection 19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 20 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) 21 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) 22 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) 23 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) 24 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) 25 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) 26 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) 27 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) 28 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) 29 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) 30 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) 31 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) 32 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) 33 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) 34 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) 35 | {5C5A39F3-F9AE-48DE-A80B-EAB05C84C1A5}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) 36 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) 37 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) 38 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) 39 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) 40 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) 41 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) 42 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) 43 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) 44 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) 45 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) 46 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) 47 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) 48 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) 49 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) 50 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) 51 | {0457BFE1-5B03-4EB1-98D6-5015805A514A}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) 52 | EndGlobalSection 53 | GlobalSection(SolutionProperties) = preSolution 54 | HideSolutionNode = FALSE 55 | EndGlobalSection 56 | GlobalSection(ExtensibilityGlobals) = postSolution 57 | SolutionGuid = {4877F73F-A0C9-4F24-A085-A3CB85FCC839} 58 | EndGlobalSection 59 | EndGlobal 60 | -------------------------------------------------------------------------------- /DataToCsvEx/TwinCAT_FileWriting.tsproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | PlcTask 8 | 9 | 10 | Task 3 11 | 12 | Inputs 13 | 14 | Var 1 15 | BYTE 16 | 17 | 18 | 19 | Outputs 20 | 21 | 22 | Image 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | CSV_Writer Instance 31 | {08500001-0000-0000-F000-000000000064} 32 | 33 | 34 | 0 35 | PlcTask 36 | 37 | #x02010020 38 | 39 | 20 40 | 1000000 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Zero-Clause BSD 2 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. 3 | 4 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # About This Repository 2 | Creating CSV or raw text files. 3 | 4 | # Special Features 5 | Auto Header Generation. 6 | 7 | Auto Folder creation if folder does not exist. 8 | 9 | High speed writing up to maximum TwinCAT tick speed. Data is buffered between hard drive writes. User does not have to do anything to take advantage of this. 10 | 11 | Everything is wrapped into single function block for easy sharing. 12 | 13 | Uses simple Methods for adding text and CSV data to file. 14 | 15 | # How to get support 16 | Should you have any questions regarding the provided sample code, please contact your local Beckhoff support team. Contact information can be found on the official Beckhoff website at https://www.beckhoff.com/contact/. 17 | 18 | # Further Information 19 | Basic CSV file writing and reading. https://infosys.beckhoff.com/content/1033/tcplclibutilities/html/tcplclibutilities_csv_sample.htm?id=5453132095136970524 20 | 21 | 22 | ## Requirements 23 | 24 | The following components must be installed to run sample code: 25 | 26 | - [TE1000 TwinCAT 3 Engineering](https://www.beckhoff.com/en-en/products/automation/twincat/te1xxx-twincat-3-engineering/te1000.html) version 3.1.XXXX.0 or higher 27 | --------------------------------------------------------------------------------