├── .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 |
--------------------------------------------------------------------------------