Jump to content


Popular Content

Showing content with the highest reputation since 08/05/2010 in all areas

  1. 3 points
    Hi All I purchased this device on ebay. The model number is "VAP11G Bridge Cable Convert RJ45" (probably many alternatives available) Cost around €15.00 Works a treat on unistream. Plug in the ethernet and power via the USB port. PLC can now be programmed with the panel door closed over wifi. Should also work with Vision but you would need a power bank or 5v power supply.
  2. 3 points
    Ohh no, the old usb issues! 1 Perhaps Win 7 is now doing the W10 trick of updating drivers to whatever Msoft deems best, regardless of what the user wants/knows. I'm still on 7 and haven't encountered this yet, but I very carefully look at every update that is offered and find what it is doing. The immediate suggestion is if you have System Restore on, you should roll back to before the updates and see what happens. 2 I have had instances where a usb cable has suddenly broken a line internally. I'm assuming you have tried another known good cable in your attempts? In my instances the error messages you're getting were similar..."unknown but I know something has been plugged in." Murphy's law says that this failure is going to happen just after an update that will appear to be the culprit! 3 Have a good read of this entire discussion: In particular note the program I recommend: http://www.pro-it-education.de/software/deviceremover/ Edit: I have discovered this link doesn't work anymore. Can now be found here: http://www.softpedia.com/get/System/System-Miscellaneous/Device-Remover.shtml I have found it incredibly useful for removing dud drivers Windows squirrels away. If you haven't had luck doing 1 & 2, try getting rid of everything using it and start again from known good drivers. ONLY install them. 4 I am finding more and more devices that used to be serial connections, but are now usb in the same looking body. But lo and behold they have just added a prolific/fake chip onto the pcb so that it "looks" like the unit is usb to the user. It is essentially still serial and the onboard chip lets them get into it if they don't have serial connections available, like modern stuff infuriatingly doesn't. I have been exceptionally careful about what I allow to happen during the first insertion of any device that likely falls into this description. It is a minefield. Tread carefully! cheers, Aus
  3. 2 points
    @chay Seriously, dude, you are going to catch nothing but grief asking questions like this on the forum. This forum is maintained by unpaid volunteers. If somebody posts code showing that they have put the time in and tried to learn themselves we will bend over backwards trying to help them. Put the time in yourself. Then ask questions. Joe T.
  4. 2 points
    Something tells me that @Joe Tauser's troubleshooting face is the same as his regular one.
  5. 2 points
    This may sound insignificant, but I want to be able to be able to add color to the comments to make it easier to see when scanning down through longer programs. You can color the side bar of the rungs but not the comments. Thanks Visilogic Team! Paul
  6. 2 points
    Hi, You can create a kind of "message box" using a rectangle and some variables on top of it. configure to each one of them Visibility bit. then when you wish to show this message box set the visibility on. Once the operator chose his option you can reset the bit and the message box will disappear. you can do the same with custom control.
  7. 2 points
    Thank you for posting. We appreciate it! The problem is you are calling the all the Modbus reads with the same trigger and you're not checking to see if the Modbus task is busy. When you call a Modbus read block it actually spins off a separate process that takes a while to complete. It also really helps to put a little breathing room via timer between reads. I've modified your code to make a state machine cycle through the reads in order and slow it down to let the read function reset. I know the examples show chaining read blocks one after another, but my experience has been this doesn't work. You're probably going to have to update your version of Visilogic to open my file. You can fiddle with the delay times to make it go faster. You'll find that when you set them too low the blocks will hang up. Let us know how it works. Joe T. Thermofisher JT.vlp
  8. 2 points
    OK. Still confusion. I'm assuming you are talking about having your push button "1" connected to Digital Input (DI) 1. Then your button 2 on DI 2 and so on. This will use many of the inputs, which is OK if you have them to spare. You saying "port" in some ways means the serial connection socket, hence my question. There are other ways of doing this, but......... Before I go any further, have you considered using a cheap touch screen computer running Remote Operator, directly linked to the PLC? In some ways this will be the easiest method of the lot as you can use the inbuilt number entry methods in Visilogic etc, but via a touch screen instead of the membrane keys. You may end in similar costs by the time you cost out keypads etc doing it the other way. You can find RO here to trial it: http://unitronicsplc.com/Download/SoftwareUtilities/Remote Operator V1.0.67.zip In the same thinking, maybe go up a PLC model to one that has a touchscreen as standard? cheers, Aus
  9. 2 points
    Hello Ofir, The addition of Timout and Retries in the default MODBUS operations will be a large help. I Often need the ability to Auto-Detect Slaves in a network - which is why I need the ability to change slave ID's. The Addresses could be from 1-255, and I don't want to have to set up 255 different combinations of possible reads(Last I knew, you could only even set up 32 slaves as a time anyway). I also need to often read multiple different register locations/lengths while switching between slaves - so i am really limited on this by the simple mode, and must use the Advanced Modbus functions. Thanks again for a great software and hardware. I'm sure these abilities will be introduced again eventually. -Matt
  10. 2 points
    Hello there :-) The Help file for UniLogic does contain information on how to use passwords to ensure security--check out the attached screen capture.
  11. 2 points
    I need to interface a Unistream with an Omron PLC. Specifically, the OMRON SYSMAC CJ2M CPU31. Omron requires an EDS file for all Ethernet/IP connections and a generic EDS file we found does not seem to work. The Unistream is configured as an adapter and the Omron is configured as the scanner. During testing, I did attempt to switch roles and have the Unistream as the Scanner and the Omron as the adapter, but neither configuration seemed to work. The error message in the Omron indicates a byte count issue; however, with the assistance of an Omron integrator, we confirmed that the number of bytes in and out of the Omron is correct.
  12. 2 points
    Thanks Ofir this is good news. For the SD Card Explorer alternative that I looked for I think I found an elegant solution. No need to install any software like FTP client what so ever. I found that Windows File Explorer can use as BI two-way FTP Client. First Unistream should be defined as FTP server with username, password and read-only option should remain unchecked. Then Using Windows File Explorer (not internet explorer) type the address:e.g: Type in username and password in the pop-up window and the SD Cars content will show with the ability to drag and drop files in both direction. The difference between any Internet browser and windows File Explorer is that the later support two way file transfer. For quick access into the SD card files and folders and being able to make shortcut on the desktop or anywhere else follow this link http://windows.microsoft.com/en-us/windows/work-with-files-ftp-site#1TC=windows-7 Hope anybody will find it useful and I will be happy for any comments Ofer
  13. 2 points
    I've passed your requests to The People In Charge--thanks :-)
  14. 2 points
    Off course there is no memory for local tags... they are local. Consider the pseudo code (assume that variables that are declared have a value of 0 and not an 'Undefined' value) public int Add(int a, int { int c; c = a + b; return c; } Now, you first call it with: Add (2, 3); the first time you call Add, c would have the value of 0, and then it gets the value of 2+3 ==> 5 Now you call it again, like Add(3, 5); Do you expect that 'c' would still contain the value of 3? It is being re-declared and it has the value of 0 again (and then it gets the value of 3 + 5 ==> 8) The variable 'c' is being declared on the stack, since it is a local variable. Once you go out of the function, it is gone (this is why it is local... It leaves within the scope of the function. And if Add would have a recursion (meaning it calls itself again and again, until a certain condition is true), then each call of the function will have it's own 'c' variable. Because of the fact that local variables are lost when you leave the function, you can't also have a positive or negative transition on the bits. The reason why you can't do a positive or negative transition on Function-In/Function-Out bits is because on each call you can pass a different bit (so you can't correctly detect a Rise or Fall). If you do want to latch a bit inside a UDFB, then it must be passed by Ref, meaning, it must a be a global bit which is passed by either as Function-Out, or Array of Bits / Strcut that contains a bit that is passed as Function-In (And with this way, you can pass a different bit on each time), or just work with a global bit.
  15. 2 points
    By the way, Cara, you guys should definitely develop a modest UDFB of this nature for us to use to wow customers and potential customers. Give it some thought.
  16. 2 points
    The EXF-RC15 is a stand-alone CANbus module. It works with either Unistream or the Vision series. You get your fastest response using a V1040 with a Snap-in Module where they are treated as local I/O. To get your 24 inputs use a V200-18-E62B, which has 30 digital inputs and 28 transistor outputs. Read the Help on the 1.25 ms Interrupt routine and the Immediate Input function block. Put those two together and you magically get 400 Hz response time on all your local inputs. Joe T.
  17. 2 points
    I'm guessing you want to display all this on the PLC screen. That's a bit more work. Two solutions come to mind- 1. Use the built-in Alarms function and configure all your events as "alarms" with no reset or acknowlege. The time-stamping and logging take care of themselves. The only downside is it will look hokey. 2. Use two tables - one stores all your event descriptions and an index pointer. When an event happens, look up the description with the index pointer and stuff it into a second table with a timestamp, bumping all the rows down and putting the newest event at row 0. Then build a screen that will display the table rows of ASCII strings of the time and the descripton. You could use the arrow keys to increment/decrement a pointer that will retrieve selected groups of rows and update your ASCII variables. It's really not as complicated as it sounds. Take a swing at it and let us know if you get stuck. Joe T.
  18. 1 point
    I have found these IP addresses to use, -- current using in a test program - works from SMTP2GO : North America: or Europe: or also check out this link : https://support.smtp2go.com/hc/en-gb/articles/227835308-Worldwide-Server-Locations-And-Email-Routing DanT
  19. 1 point
    Hi, On the 15 August we got a few complaints that customers get this run time error 5 when they are trying to download application via U90Ladder. We investigated more and found that this is an issue caused by the latest Microsoft update. In order to solve this issue until Microsoft will release new update - Please try to uninstall the update via "New installed updates" or roll back before the update. Please see below link to Microsoft update and known issues: https://support.microsoft.com/en-us/help/4512508/windows-10-update-kb4512508 *For other version of Windows Microsoft KB article number will be different. Article can be found in the below link: https://support.unitronics.com/index.php?/selfhelp/view-article/u90-ladder-and-runtime-error-5 Best Regards,
  20. 1 point
    Open favorites (if possible) and make snapshot to save for feature reference. Close Unitronics applications/programs. Go to "C:\Program Files (x86)\Common Files\Unitronics" and rename "Eth_Favorites.evb" file to "Eth_Favorites.evb.old". Create favorites again. It should work. *Favorites file somehow damaged.
  21. 1 point
    For what you want I wouldn't be going to too much trouble. The unit uses about 12W max so I'd find yourself a little enclosure like my pic I found. Plastic lids are very easy to work with, and if you don't have precise machinery to machine the hole, you can easily do it carefully with a jigsaw. Put some duct tape on where you're cutting to protect the surface that will remain. For power I'd simply use an external plug pack, and run the lead through a nylon gland on the side of the box. Same goes for your ethernet connection, use a gland big enough to let you run a standard ready made patch lead through of the right length. Your location will dictate where you get this stuff, all of it can normally be found at any decent electricians' supplies store, or a hobby electronics type place. cheers, Aus
  22. 1 point
    It's totally this. It helps you organize the subroutines into subcategories. I rarely use modules (other than the Main module, of course), but once a program gets extremely complex, grouping subroutines into modules can make program development and troubleshooting a bit easier. The PLC doesn't care.
  23. 1 point
    On the screen issue, in theory it can't happen with Visi not letting you do it, but sometimes it does and needs an extra pixel clearance on what Visi lets you do as minimum etc. I know this is a bit convoluted explain, but its the best I can do! cheers, Aus
  24. 1 point
    Hi Try using a positive transition contact on "Video Timer Out" on net 2 You may be calling the screen continuously with the direct contact. Regards Denis
  25. 1 point
    Perhaps the timeout and retries on the missing slave are upsetting whatever intervals you have set for the sequential reads from all the others. Carefully go through the total possible timing per read and ensure that you have allowed sufficient "overlap clearance". cheers, Aus
  26. 1 point
    Hi again all, In setting up a new little computer that I'll talk about soon in another post, I persevered with an issue I could see arising. Discussed this with Saragani and eventually arrived at this simple solution. I was worried that if the tablet was ever lost or stolen, the device had all my ethernet links and passwords to remote sites on it, essentially embedded into Visilogic. Not really a good thing to have all the client's websites and plc access readily available to the crooks! I wanted a simple way to have that info somewhere else, like the TF card that I could remove as necessary. I considered installing the entire program onto the card, but this would then lead to lag as it was accessed for everything. Instead, I eventually found out about Symbolic Links. Those of you more into puters than me likely know of them already, but they were news to me, even though I've been using puters from when you ran them by burning a stick! They work like a shortcut that Windows itself uses. If Visilogic is being correctly run as Admin, it stores all the ethernet settings in C:\Program Files (X86)\Common Files\Unitronics as a file called Eth_Favorites.evb. What the link does is leave a "redirection" at that location to the location of the "real" Eth_Favorites.evb. In my learning curve, I found lots of info, with this site being the best explanation: https://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/ and the little program that I found easiest to use and doesn't install is here: http://www.softpedia.com/get/PORTABLE-SOFTWARE/System/System-Enhancements/Portable-Symbolic-Link-Creator.shtml We now come to how to use it all, so have a look at the attached screenshot. It is all pretty self-explanatory. The Real info is at E:\Unitest\Eth_Favorites.evb whilst the link is in the correct folder. If you do it correctly, it all works and is totally transparent. To make sure of full operation, do a test address to ensure that the real .evb is updated correctly. Using Notepad++ or similar, you should see the test address has been correctly added after you close the program. cheers, Aus
  27. 1 point
    Hi Guys, There is no direct option to reset HSC which is on expansion unit. Attached is application which implements resetting HSC using virtual HSC. In the attached application instead of working directly with the MI that linked to the HSC (which you are unable to change/reset) working with the virtual HSC. Expansion HSC reset.vlp
  28. 1 point
    My copy of the book arrived. Can't wait to dig into it!
  29. 1 point
    I disregarded IP address range because of quote above. I guess that's a statement, although it does end with a question mark. I thought that address looked like Microsoft's "dummy" address. Any two devices on the same physical LAN and common subnet should be able to communicate. I didn't see or confirm the IP address the phone had obtained. 169.254.x.x is not an address pool I would expect to see in a DCHP router. It would be a good measure to put router, plc, and phone in a more traditional address pool like: 192.168.x.x or 10.0.x.x I have an app on my iphone called "ping lite" that runs IMCP ping command. Very helpful in determining if basic network communication is working between phone and other device (PLC in this case).
  30. 1 point
    RobertW: If you have specifics you can post on forum or call Unitronics support. Both helped me greatly when tranlslating a large program from Visilogic to UniLogic. If you are starting with Unilogic it may actually be easier, I really had to retrain my brain away from all the terminology and form of Visilogic. It's not bad once you get the hang of it. You have a powerful support team to assist you, be NOT afraid to use it Sir.
  31. 1 point
    I recently came a cross with a UniLogic application that use large structs. For example, one struct was composed of 80 members, and most of the members type was INT16, like so: In memory the struct look like this: struct MyStruct //struct size is 80 * 4 = 320 bytes { INT32 ID; //size 4 INT16 Val_1; //size 2 CHAR[2] padding1; //size 2 INT16 Val_2; //size 2 CHAR[2] padding2; //size 2 //…. INT16 Val_79; //size 2 CHAR[2] padding79; //size 2 } notice the padding that added to the struct. That's common in software in order to align the memory so work will perform more effectively. This padding cause every 2 bytes in an INT16 type an extra "weight" of 2 bytes – so every INT16 is 4 bytes. One can think that the struct size is 4 + 2 * 79 = 162 bytes, when in fact it 320 bytes, almost two times bigger (!). Now, let's try the next approach: In memory: struct MyStruct_NEW //struct size is 4 + 2 * 79 = 162 bytes { INT32 ID; //size 4 INT16[79] Val_Arr; //size 158 } And we got a struct size 162 bytes, as intended. Just imagine we use struct "MyStruct" in a 3,000 line Data Table, we will waste almost 0.5M bytes (3,000 * 158), while "MyStruct_NEW" waste nothing. For conclusion, when creating structs in UniLogic consider the padding factor in order to reduce your PLC memory consumption.
  32. 1 point
  33. 1 point
    You can use Modbus for Vision-Jazz communication. Jazz has only one Ethernet port but it can be configured for both Modbus and PC connection (only one active at a time). Put memory segments you need to read in sequence (MI0, MI1, MI2...). Contact support for additional help to make SCADA work with all PLCs, it must be something trivial that you overlooked. I always received fast and useful advice Unitronics support.
  34. 1 point
    Hi - I was wondering if there is a way to auto-scale the trends, instead of min value and max value you would set it it auto and it would automatically scale based on the data set when displayed. Thanks.
  35. 1 point
    Hi Kal, Go to VisiLogic help to see the RS232 pinout: The programming communication kit is RJ11 4 wire cable (standard 4 wire landline phone cable) and PC RS232 adapter P/N: MJ10-22-CS25. If you have other Unitronics products (Except JZ-PRG), you can use the same communicating kit. You can also make it on your own , please see the diagram in VisiLogic help.
  36. 1 point
    Hi Splathappy, IO Link is an extension to existing protocols. You could use an EthernetIP Field coupler that speaks IO Link to make it work. AXL E EIP IOL8 DI4 M12 6P From Phoenix Contact can make this happen for you. BTW IO Link is definitely something great to look at! Best Regards,
  37. 1 point
  38. 1 point
    Hi, Thank you for interesting in Unitronics PLCs. V430-TR34 PLC does supports simple PTO. You can configure it in Hardware Configuration - High Speed Otputs (Step Control). But this PLC model also have support for PTO - Pulse Training Output. This supports acceleration, deceleration, and other Simple Motion Control function. But before use this mode, you have to configure PTO. There is PTO example in directory: C:\Program Files (x86)\Unitronics\Unitronics VisiLogic_C\Examples\Version 900\Project examples\PTO\ V350_PTO example plus Jogging.VLP Look how it realized, and I hope you will like it. *Use only "PTO Read Status" without configuration is useless. I hope you can realize your PTO better. B.R.
  39. 1 point
    Can you still communicate with the V570? What is displayed on the screen? It may be necessary to update the operating system or reinstall the firmware. Once this is complete we recommend downloading a blank program, then attempting to download this project again.
  40. 1 point
    It is absolutely possible to sequence communications to any number of devices. How are you sequencing between each read command? Would it be possible to post your code? Also, what is the status message of each of the Modbus read/write commands?
  41. 1 point
    Solved (look at the end for solution, symptoms are at the start). Still can't get Visilogic 9.7.60 to work in Windows 10. I have tried to clean the registry of all Unitronics entries, clear the directory after uninstalling all Unitronics software. I am getting an "Unhandled exception" "Access to the path 'C:\Program Files (x86)\Unitronics\Remote Operator\Recent Projects.xml' is denied." error when trying to use Remote Operator (install when fine). The folder is present, but the files is not there. Also still getting the "Load 9Permission denied" error after clean install in Windows 10. After this error the program does not load but is stuck in the task manager as a still running task. If I cancel the start-up error and open a file I get a "Run=time error "70': Permission denied" from VisiLogic. Clearly Windows 10 won't give it access to things it needs access to even after being an administrator and setting UAC to off/minimal. Solution: You have to run the installation "Run as Administrator" then each time you run the program you have to "Run as Administrator" also. This also fixes the "Remote Operator" problems (don't have to do the install that way just each execution).
  42. 1 point
    Many thanks, HigHTech. I got it working now. Paint.net works, but I didn't realize that you have to save the PNG as 32-bit. I was using 24-bit without realizing that the extra 8 bits is the transparency layer.
  43. 1 point
    There's a band called 1023MB. They haven't had any gigs yet.
  44. 1 point
    Hi, According to my experience the signal quality range is from 1 to 31 (31 means best signal quality) and usually when the signal is below 11 we suggest to reposition the antenna. 18 should be good enough.
  45. 1 point
    There isn't a direct tag that indicates which screen was selected previously, but you could also implement logic that each time a screen jump is performed a bit tag is set indicating which screen was just implemented. For example: On Display 1, I press a button that performs 2 actions. The first action is to jump to screen 2, the second action is to set a bit tag with the description "Screen Jump from Display 1 Performed". This bit tag can then be used as necessary to indicate that a jump was performed from display 1. It can then be reset as necessary within the logic.
  46. 1 point
    Ok--here are the new forums! http://forum.unitronics.com/index.php?/forum/65-unistream-hmi-plc-and-unilogic/
  47. 1 point
    I know...I know I'll submit them again. The resolution is a matter of hardware, which is pretty much determined by market demand...if enough people want it, it may make the list. The PLC simulator--heck, even I want one <sigh> But yes--never say never :-)
  48. 1 point
    Yes, my Main subroutine never has any code in it other than calls to other subroutines. One of the very first is the call to the "Inputs" subroutines, and one of the very last is the "Outputs" subroutine. I would say first that you should specify what you regard as an issue. But beyond that, I would contend that there are certain caveats with positive and negative transitions that in fact make buffering inputs and outputs even more valuable, not less. It gives you much more control. With ladder, the traditional definition of the scan had the physical IO only updating between single scans of the program. This way you could rely on knowing that the physical Inputs would not change state while your program was in a scan cycle. Some modern controllers, (AB Compact Logix) no longer adhere to this. They have what is considered an asynchronous scan and results in the I/O possibly being updated mid scan, perhaps even multiple times per scan. At face value it may not seem like that would be all that bad of a situation, but in actuality it creates a host of complications and extra considerations that need to be made while coding. Most of us mandate buffered IO on a Compact Logix system as a result, so that we know that we are looking at one single snap shot of the IO for every single scan. The use of buffering has created a rift where most are usually adamantly opposed to it or fervently for it. Those that oppose it often cite extra time to code, extra memory use, and believe it adds a layer of complexity that doesn't need to be there. Those of us who are for it feel the cost of the memory and time is generally negligible and is won back over time by having a more robust system. We contend that it makes the code simpler to understand, not more complex. It also makes it nice if you blow an IO point on a card and want to move the logic over to a spare. With the buffering you simply change it in one spot and your done. The retort to that is usually that you can simply do a find/replace just as quickly. Well maybe, but what if you want to for example debounce that signal. All of a sudden find/replace falls flat. Whereas I would simply go to my buffer and put a timer between my physical IO and my buffered IO and it automatically takes effect for all instances of that signal. And by the same token, this is where some other nice aspects of buffering come in to play. The buffering doesn't need to be a straight one to one mapping. It can serve the function of creating ON debounce, OFF debounce, ON and OFF debounce, one shots, and signal combinations. Having this stuff in the buffer removes it from the actual code so that the code is easier to read and understand. I often find reason to have an input debounced in both the ON and OFF direction, and the code to do this is will just clutter the actual sequence program. I also often buffer things in multiple ways. For example I may have a normal instance of an input and a one-shot instance of that same input. This serves two nice functions and illustrates why I think it addresses exactly what you were alluding to with your question. For one, you will find in the documentation that Unitronics discourages overuse of P and N contacts because they have a detrimental effect on the PLC resources. If you need to use the positive transitions of the same signal several times in your program you are much better off using one transition contact to control one normal buffer bit and then just use regular contacts throughout with that buffer bit. You can make it clear with a naming convention (ex. P Control Start PB) that it is transition. The other benefit is you have complete control over how that transition is refreshed now. If you recorded that transition with the buffer bit right in the first subroutine you can count on the fact that that buffer bit will carry the same state throughout the rest of the scan, no matter how many times you jump in and out of subroutines. That is of course unless YOU modify that buffer bit elsewhere. And not to be forgotten, the combination signal. What is this? Well possibly it is making more inputs out of fewer. Perhaps you have three aux guard contacts coming into the PLC in separate inputs. It might be beneficial to have one single signal that tells you if all three are on. Or, perhaps you have a mulitplexed signal coming in. Maybe it is a selector switch for a product select where product one is both off, product 2 is one on, product 3 is the other on, and product 4 is both on. Now you can make four buffered inputs that decode this one for one and product one selected, product two select, etc. Again, stuff like this tends to just obfuscate the sequence code. Perhaps you have buttons on the HMI that perform the same function as physical buttons, then you combine these and have both signals controlling the same buffered bit. I could go on and on. This is again another example of where buffering is handy. It allows you to write code that is non-hardware specific and then just attach those mapping in one spot. I am not certain what you mean by the input format is different. Perhaps you could clarify? What kind of problems are you having?
  49. 1 point
    The reason for Fatal error can be also strong picks of electromagnetic noise. Maybe something changed in the controller environment? New big machine? Or contactor in the cabinet started to perfomr worst, emmiting more noise? You can try function "Check subroutine by error code" (VisiLogic > Edit menu). This function will point you to the subroutine, where the application stopped with this fatal error. This can give you some direction.
  50. 1 point
    Did you already get the software - U90Ladder (www.untronics.com > Support page > Downloads)? It comes with detailed help and more than 100 working examples.
  • Create New...