I've written programs for Siemens TI505 (using Ti-Soft and PLC Workshop), Siemens LOGO!, S5, S7-200, and S7-300/400), various Modicon boxes, IDEC, Direct Logic, Allen-Bradley SLC and ControlLogix, and Square D (I think that's all of them). What I would choose if the decision is mine varies depandant on what the local I&E tech is capable of working with, the amount of IO, and the complexity of the task. For my money the Siemens TI555 is the easiest to implement. It has built in analog alarm blocks and PID loops. The Special Function program capability is handy for specialty programs like gas and liquid flow calcs or creating an interface to a 3rd party serial port with non-standard data packets. The Ethernet card made by CTI for the TI series is easy to program. I have 14 TI545's and one TI555 (with 6 RBC's) networked together in one of our gas plants using this card in each processor rack. There are over 125 PID loops and nearly 200 analog alarm blocks used plus over 1,000 lines of ladder logic and 18 Special Function programs on the TI555 alone. 10 of the PLC's transfer data to the TI555 using peer-peer over the ethernet backbone. I also have two S7 remote IO racks connected to the 555 via the Profibus port on the 555 processor. We used a fiber optic profibus network for that. There are also 5 independant, 6000 plus tag Wondware nodes on this network. Once connected to our WAN (RAS, VPN, or Direct) I can remotely connect to any PLC on the network and troubleshoot a problem or even program (don't like to do that.). I also have the latest Wonderware app on my laptop so I can see what the operator is seeing from anywhere on the WAN. CTI also make a serial comm card (various flavors but we use the 2573-MOD modbus card mostly). The serial card configures very similarly to the Ethernet card. There are 4 ports per card. 2 can be used for MODBUS RTU (RS232 RS485 multidrop) and two for MODBUS ASCII. Typically, in a data concentrator application, we use Port 1 as a MODBUS RTU slave and Port 3 for the MODBUS RTU master. If we need more Master ports for devices that do not use the same baud rate we just add another card. This system has proven to be very reliable (Zero downtime in 5 years). So, for large systems where I want to emulate DCS functionality and provide an easy to learn programming environment for the local tech I would chose the TI model from Siemens and Workshop software from Fast-trak Softworks.
For smaller or single processor jobs I like the Siemens S7. If it's ethernet card was able to handle the density of ethernet traffic that the CTI ethernet card can it would be my first choice. The S7 offers many options on programming language including Statement List, Structured Text, Ladder, Function Block, and ??? one I obviously don't use

It allows you to create and compile your own blocks which greatly speeds application developement. For instance, I have a block that I created for lighting a pilot on a burner management system. If I have a 10 burner heater, I call the block 10 times and populate the inputs with the correct addresses for each pilot. Outputs and intermediate operations are stored in data blocks. I also have a pseudo AGA7 calc block (110 internal variables) that I can use in lieu of a MODBUS connection to a flow computer. The S7 is a good data concentrator and MODBUS RTU Slave or Master is easily implemented. Using ProTool integrated with Step 7 it is very easy to develop an application for a local operator interface (touch panel, text display, etc). If I had one complaint it would be that their PID loop is incomplete at best. I've taken their block apart and if I can ever find the time I am going to modify it.
The S7-200 is my first choice for small applications. Especially if I need a MODBUS slave. It's easy to program and has a myriad of features sometimes not found on larger PLC's
I like the Direct Logic line of PLC's. Their PID loop is very robust.
My least favorite? Allen-Bradley. I do not like their programming software. I hate the way they name IO. The aforementioned systems all have a clean import / export feature that I make use of. I am a documentation fiend and I hate having to type information twice therefore I create my IO map in Excel, including symbols and descriptions, and then import that info into the program. Allen-Bradley's import / export feature yields a file cluttered with useless nonsense. When they implemented the ControlLogix line they almost got it right. There are a lot of things that I like about this line however their import / export feature is horrible and they blew it big time with their implementation of Structured Text. What good is Structured Text when there is no way to easily (note that I said easily) associate variables with the instance of the block. The blocks are not compiled and there are no instance variables. Each variable has to have a tag. The tags are not auto-generated. Why is that a big deal? Using my pseudo AGA7 block as an example- There are 110 variables associated with this block. If I implement it in the ControlLogix platform I have to manually create 110 variable tags for EACH INSTANCE of the block. Plus, I have to edit the instance of the block to point to the correct variables (can't use the same variable every time). I could use indirect addressing to mitigate this somewhat but all 110 variables per instance would still have to be generated. I was frankly very disappointed in the way that A-B implemented Structured Text.