Codesys and CANopen multisame NodeID - codesys

If I have Codesys project with CANopen manager and I add a CANopen slave node to the CAN with node id 19, the system is clear to me, but if I add two same sensor devices with same factory preset nodeid 19, how do I change the nodeID of either of two? I do not have any idea. Devices support LSS but i dont have idea how to implement nodeid change with or without it. Should I code it or should the canopen manager change the nodeid somehow. Any ideas are welcome. Of course I could change it by adding first device to the CANand change it and after that I could add the second one to the CAN bus. But I want to change the dynamically when both are in the CAN bus same time so it should be same situation as in future production line.

You can either write a small program in CODESYS that changes the ID, or if you have a USB to CAN tool you can send the commands to change the ID.
This is normally done in a 2 step process.
1- Set the parameter
2- Save the parameter (usually with some "magic word).
The message to change the ID will depend on the manufacturer.
Sometimes this is in the EDS file, so it might be worth it to have a look in there.

Related

Setting trainer resistance using Swifty Sensors and Wahoo's cycling power service extension

I'm using the SwiftySensors CocoaPod to connect to a Wahoo Smart Trainer. It's advertising CyclingPowerService and DeviceInformationService. I've been able to get speed and power values without issue. Wahoo apparently extended the CyclingPowerService standard to allow setting resistance via that service instead of the Fitness Machine Control service.
https://github.com/codeinversion/sensors-swift links out to another Github page dealing with that extension, but that link is broken.
My question is: how should I go about setting the trainer's resistance? Wahoo's app can do it, so the machine is equipped for it. This is the only time I need to change the trainer's settings. Otherwise, I'm just reading sent information and SwiftySensors works great.
I've referenced the following post: Writing BLE to Cycling Control Point - Adding Resistance. Someone there said using CyclingPowerService to set resistance was possible without offering any guidance. I'm not very experienced with Bluetooth, so any information would be great!
Thank you Jordan. That was the answer. The broken link I referenced must have been pointing to the following repo: https://github.com/WahooFitness/sensors-swift-trainers
The following instructions assume that you're already able to connect to the trainer to receive data from it, like speed and power, using the SwiftySensors CocoaPod and the CyclingPowerService. Using the repo linked above, I was able to set the resistance to the Wahoo Snap trainer. Note that after you install that new repo, before you start scanning for sensors to connect to, you need to call
CyclingPowerService.WahooTrainer.activate()
From there, you set the resistance with
if let wahooTrainer = cyclingSpeedService.wahooTrainer {
wahooTrainer.setResistanceMode(resistance: 0.5)
}
The resistance is set using percentages. The value for resistance will be a Float, somewhere between 0 and 1.

'Activate' Bluetooth LE Energy Data stream

For a student project, we're working on connecting a Bluetooth LE device (that both transmits and receives) to an iPhone or iPad in order to read data from it to display to the user in realtime. We have proof that this is doable by the company that made the device and we've actually managed to get a connection and get some data.. however it pings every 5-10 seconds and seems to be a random subset of numbers with minimal changes after changing something on the device which is making us none the wiser.
Now, of course, we went to the company that made the device and app first and we do have approval for us to use their hardware, but haven't been able to get a SDK / API from them to use with the application. So, our plan is to make our own way through it and find what we need.
This is where we're getting stuck. We have the following:
Connection based on Name or Bluetooth Device Address
Scan services (and cascading scan in case the services have services within them as specified in the CoreBluetooth documentation)
Read Characteristics from said services.
Decrypt value into 8bit UInt so we get some actual readable data.
This is an example of what we've got with the value still as it comes in.
Service: 0x1c0476440, is Primary = yes. UUID: 058d0001-ca72-4c8b-8084-25e049936b31
value <53636da1 7a616c74 73616c74 73616c74 73616c27>
Now, looking at this all, I presume the service here is some kind of 'staying alive' ping and it's giving some auxiliary info about the device's current state.
The question we have then boils down to this:
How can we further 'explore' the device? We don't seem to be getting any additional output aside from this however looking in the device manager from windows we get a couple of hits that look like this (Example):
{058d0001-ca72-4c8b-8084-25e049936b31}[6]
Which have values in either a hexidecimal value, boolean or datetime without clear identifiers. Is there a way for us to send a message to the device to change the value in that uuid using Swift, or is this impossible?
While solved now, I'm not accepting this as the answer. My solution? Try things. Stupid 'Needle in a haybale' things.
I changed the uuid from 058d0001-ca72-4c8b-8084-25e049936b31 to 058d0002-ca72-4c8b-8084-25e049936b31
and voila. I could do more. I tried 3, and again, a new result and a working data stream...
#Paulw11's comment is also a good way to solve this issue we found out.

Is it possible to have two Modbus map in one PLC?

I have a PLC that already have a big map (3000 registers). I have a PC software to talk to the PLC.
Now the customer want to re-arrange the registers. I wonder whether I can map the same logic to a second map. example, to my software, Modbus ID 1: 40001 is to move a valve, and customer want to move to 40100. so is there a way to do the same thing to both ID 1:40001, and ID2:40100?
This is a general question. if you need to know my PLC underlining programming language, I have to take a look.
This should not be a problem at all.
You need to provide more information though if you want how this is to be done.
The problem is actually if for example you need to move 40001 to 40100 and 40100 to 40200, then you need to be sure that the 40100 was moved to 40200 before you overwrite it, as I understand, this is not an issue for you, you are moving to an entire new area. If so, then you are good to go, provide PLC type, software and version, etc. to get a precise answer

Siemens TIA portal, specifically tags

I have a PLC with a profinet, connected to a profibus DP slave. The plc is connected to a HMI screen. I am very new to this software and the guide that came with it, doesnt help me with my problem. I have tags created for various I/O but I cannot link any of the tags to the slave, in the IO tags tab it just says, there are no IO tags to display. Does anybody know how to link the tags?
Kind regards
Firstly very less information I get from your question, like what connection do you make betweeen PLC and HMI, Assuming you have profibus connection with AS-OS compile tags should be generated if connection is healthy.
Then on HMI (assuming WinCC) go to Tag Management and the Simatic S7 Protocol Suite under this you will find connection Profibus, Right click and check System Parameter you will find logical device name. Make sure to select correct device name from the combo box.
Then it should be fixed.

FileMaker: Is there any native way to get the client's computer name?

Is there a FileMaker (11 Advanced) native way to obtain the client's computer name in a script? The computer name shown in FileMaker server when displaying clients connected to a database would do nicely.
Purpose: I'm looking to have filemaker recall and set window position based on user and computer. (The same user could have a different window position and size preference for their laptop than for their desktop -- think of byHost user preferences.)
Alternate: I'm aware that a the client computer name could be grabbed using an external script, but would prefer a native way, if available.
I am still unable to answer the question as asked. However, for the purpose stated, I just found the command
Get ( SystemNICAddress )
It will provide a unique identifier for each computer that will change infrequently. This is all that is required for my purpose and will likely work better than the value I originally requested.
This new function was introduced in FileMaker Pro 12.0:
Get ( PersistentID )
From the FileMaker documentation at http://www.filemaker.com/help/12/fmp/html/func_ref2.32.54.html:
"Returns a unique, unchanging identifier for the computer on which FileMaker Pro is running or the device on which FileMaker Go is running, in the form of a 32-digit hexadecimal string."
If you're using FMP 12+, this would be a better choice than relying on Get(SystemNICAddress), which can change.
I know this is an old post, but we've worked with the same thing for other reasons and maybe this will help someone.
Since it doesn't seem that FM natively has this function built-in, even for version 17, I just made a table with the NIC address records created when the file opens (if it doesn't exist already) and then the DNS name was manually added later. Then the DNS name could be referenced after using GET to find the NIC address. Some computers do have multiple NICs so those are broken up into separate records (it's just returned as a list) but the same DNS name is applied to them all. Except in the case of a VPN NIC which sometimes reports at 00:00:00:00:00:00; those are just ignored. Otherwise you may have multiple computers with the same null NIC - and that isn't helpful. We use the DNS name for reporting of our employees sales in relation to their call volume. And trying to remember the NICs of a hundred computers is not as simple as a DNS name to know where the person was sitting at the time.
There is a native way to do it.
Get ( HostName )
But you can't use this with a hosted filed, file needs to be opened on the client machine locally.
There can be other advantages to using local FileMaker files that communicate with hosted files
- Better performance for graphics heavy layouts
- Providing an offline cache
Another approach is to use a system shell script.
For completeness sake, a non-native approach, there are a few Filemaker plugins that can provide this functionality. www.360works.com/scriptmaster/
To identify client with FileMaker 11, I simply use:
Get(DesktopPath)
Maybe it could help...